首頁  >  文章  >  後端開發  >  為什麼 `i = i 1;` 現在在 C 17 中是合法的?

為什麼 `i = i 1;` 現在在 C 17 中是合法的?

Barbara Streisand
Barbara Streisand原創
2024-11-01 06:38:01644瀏覽

Why is `i = i     1;` now legal in C  17?

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

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