C 17 使i = i 1 合法化;由於修改了算子求值順序
在C 11 中,賦值i =i =i = i 1;被認為是未定義的行為。然而,在 C 17 中,它變成了有效的表達式。為了理解這項變化,我們需要深入研究修改後的運算子求值規則。
Pre-C 17 未定義行為
在C 11 中,操作數求值的順序賦值運算子的定義如下:
在 i = i 1; 中,後遞增 i 表現出副作用(修改 i 的值),這可能與賦值操作交織發生。這種潛在的未排序副作用會導致未定義的行為。
C 17 的修訂排序規則
C 17 為賦值運算子引入了新的排序規則:
此修訂規則適用於右側操作數的值計算和副作用。
合法化of i = i 1;
在 i = i 1; 中,右操作數是 i 1。此表達式的計算涉及括號內 i 的後綴增量,然後加 1根據新規則,整個評估是在對 i 賦值之前排序並完成的。
因此,在 C 17 中,修改 i 的行為(副作用)在實際賦值之前完成,從而消除了潛在的未排序的副作用。此修改後的排序使 i = i 1;表達式在 C 17 中合法。
以上是為什麼 `i = i 1;` 現在在 C 17 中是合法的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!