未初始化變數用作自己的初始化程序的行為
C/C 中的此程式碼引發了有關其行為的問題:
int i = i;
儘管存在未初始化的變量,但此程式碼編譯時不會出現警告和錯誤。為什麼會發生這種情況,標準對其行為有何規定?
不確定值和實現依賴
當像 i 這樣的變數用於初始化自身時,它包含一個不確定的值。該值可以是未指定的值或陷阱表示。未指定的值不是由標準定義的,並且取決於實作。如果實作支援陷阱表示,則在使用時會觸發未定義的行為。
帶有填充的未定義行為
如果實現以整數類型分配填充位,並且如果不確定值是陷阱表示,然後使用它會導致未定義的行為。這是因為訪問陷阱表示會導致意外結果。
沒有填充的未指定值
但是,如果實現不分配整數中的填充位,則不確定值只是未指定。在這種情況下,不存在未定義的行為,i 的確切值由實作確定。
未定義的行為,地址已被佔用
此外,該行為可以即使 i 沒有獲取其地址,也會變為未定義,如 C11標準所述:
「如果左值指定一個可以使用暫存器儲存類別宣告的自動儲存持續時間的物件(從未有其位址已取得),且該物件未初始化,行為未定義。 ”
因此,此代碼的行為依賴於實現,並且可能根據各種因素而未定義。
以上是為什麼 `int i = i;` 編譯時會出現未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!