未初始化的變數初始化:C 中的悖論
在C 中,僅透過自身初始化新變量被認為是有效的,這似乎違反直覺。為了理解這個概念,讓我們分析以下程式碼片段:
<code class="cpp">int a = 3; { int a = a; // Initializing 'a' with itself cout << "new a = " << a << "\n"; a = 5; cout << "a = " << a << "\n"; } cout << "old a = " << a << "\n";</code>
乍一看,人們可能會認為程式碼片段應該列印:
a=3 new a = 3 changed a = 5 old a = 3
但是,第二行通常會返回「新的a = 0。」要理解為什麼會發生這種情況,必須深入研究C 中變數初始化的複雜性。
語法上,程式碼是有效的,因為 'a' 的聲明先於其在內部作用域內的初始化。在 C 中,變數的名稱在聲明後甚至在為其分配任何值之前就可用。這允許自引用初始化,例如程式碼片段中使用的初始化。
但是,從行為的角度來看,使用未初始化的變數會導致未定義的行為。編譯器可能會發出警告,但由於分析變數初始化的程式流程的複雜性,它們沒有義務標記此類事件。
在程式碼片段中,'a' 在外部範圍內以 3 初始化。當進入內部作用域時,將宣告一個新的“a”,其名稱與外部作用域變數的名稱相同。然後,這個內部“a”被自初始化,這導致其值未定義。將 5 分配給內部作用域內的內部 'a' 不會影響外部 'a'。
因此,雖然單獨初始化變數在語法上是有效的,但應謹慎使用,因為它可能會導致未定義的行為。
以上是為什麼用自身初始化變數會導致 C 中未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!