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