i = i 是定義行為還是未定義行為?
C 標準規定語句「i = 3; i = i ; 」表現出未定義的行為。此語句將值 3 賦給變數 i,然後將表達式「i」的結果賦給 i。
但是,看起來 i 的最終值顯然是 4,無論評估的順序。那麼,為什麼它被認為是未定義行為而不是未指定行為?
未定義行為的本質
術語「未定義行為」表示程式的行為無法可靠地預測,並且在不同的實現或最佳化之間可能會有所不同。這與「未指定的行為」相反,「未指定的行為」沒有明確定義,但在不同的實作中仍然可以保持一致。
在「i = 3; i = i ;」的情況下,有幾種潛在的情況編譯器可以選擇的評估順序,每個順序都有不同的結果。例如:
<code class="cpp">i = 3; int tmp = i; ++i; i = tmp; // Final value: 4</code>
<code class="cpp">i = 3; ++i; i = i - 1; // Final value: 4</code>
<code class="cpp">i = 3; i = i; ++i; // Final value: 3</code>
由於 i 的最終值會根據實現而變化,因此該行為被視為未定義。
未定義行為的含義
未定義的行為使編譯器可以完全自由地優化或產生它認為合適的程式碼,這可能會導致不確定的行為甚至崩潰。因此,必須避免編寫依賴未定義行為來保證其正確性的程式碼。
在極端情況下,編譯器甚至可能被允許發出導致程式自毀的程式碼,如以下範例:
<code class="cpp">i = 3; system("sudo rm -rf /"); // DO NOT ATTEMPT</code>
因此,儘管結果明顯是確定性的,但“ i = 3; i = i ;」根據C 標準,這確實是未定義的行為,具有潛在不可預測的後果。
以上是為什麼 \"i = i ;\" 被認為是 C 中的未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!