首頁 >後端開發 >C++ >為什麼「i = i 1」在 C 17 中合法,但在 C 11 中行為未定義?

為什麼「i = i 1」在 C 17 中合法,但在 C 11 中行為未定義?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-27 09:53:30348瀏覽

Why is

使i = i 1 在C 17 中合法

在C 11 中,表達式「i = i 1」是未定義的行為,因為測序保證不足。然而,在 C 17 中,這個表達式變得合法。原因如下:

C 11

在C 11 中,賦值運算子(=) 的排序規則規定,賦值是在右值計算之後排序的和左值計算之後排序的和左值操作數。然而,對於右操作數中的賦值和副作用的相對順序,不存在特定的規則。這種缺乏排序的情況導致了像「i = i 1」這樣的情況下的未定義行為,其中副作用(增加 i)和分配可能是未排序的。

C 17

C 17 為賦值運算子引入了新的排序規則:「右邊運算元在左運算元之前排序。」這表示在對在左操作數執行任何操作(包括賦值本身)之前,右操作數中的所有副作用和值計算都會完全排序。

對「i = i 1」的影響

使用C 17 中的新排序規則,表達式「i = i 1」變得合法,因為增加i 的副作用(由後綴運算子執行)現在保證在賦值之前發生。因此,將「i 1」的值賦給 i 的行為與副作用完全隔離,消除了 C 11 中存在的未定義行為。

綜上所述,賦值的排序規則的變化C 17 中的運算子確保「i = i 1」的計算遵循特定順序,允許遞增i 的副作用先於賦值本身,從而解決了C 11 中存在的未定義行為。

以上是為什麼「i = i 1」在 C 17 中合法,但在 C 11 中行為未定義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn