首頁 > 後端開發 > C++ > 主體

為什麼 \'i = i ;\' 被認為是 C 中的未定義行為?

Patricia Arquette
發布: 2024-10-26 04:56:30
原創
818 人瀏覽過

Why is

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!