首頁  >  文章  >  後端開發  >  C 17 中是否合法定義了「i = i 1」?

C 17 中是否合法定義了「i = i 1」?

Linda Hamilton
Linda Hamilton原創
2024-10-29 03:02:02570瀏覽

 Is `i = i     1`  Legally Defined in C  17?

C 17 中i = i 1 的合法性

C 17 引入了一個微妙但重大的變化,使表達式i = i 1 合法化; ,這是先前在C 11 中未定義的行為。

在C 17 之前

在C 11 中,賦值表達式的求值順序指定如下:

  • 左右運算元的值計算在實際賦值之前進行排序。
  • 但是,賦值本身和右側潛在副作用之間沒有特定的排序要求( RHS) 表達式。

在 i = i 1; 的情況下,這意味著使用後綴運算子遞增 i 的副作用可能發生在賦值之前或之後。缺乏排序導致了未定義的行為。

C 17 中的變更

C 17 在賦值運算子的規格中引入了附加句子:「正確的運算元是在左運算元之前排序。 」這個看似無害的添加具有深遠​​的影響。

透過在 LHS 之前對 RHS 進行排序,C 17 現在可以確保 RHS 中的任何副作用都保證在分配本身之前發生。這有效地將賦值操作與任何潛在的未定義行為隔離。

重寫範例

為了說明這項更改,讓我們分解i = i 1; 的計算;在C 17 中:

  1. 右操作數(RHS)的值計算:i 1

    • 使用後綴遞增i(副作用)。
    • 增加的值加 1。
  2. RHS 排序在LHS 之前:

    • RHS 中的所有副作用(包括增量)都會發生.
  3. 左操作數(LHS)的值計算:i

    • 使用i 的目前值。
  4. 賦值:

    • 將 RHS 的結果分配給 LHS。

透過確保所有副作用RHS 在賦值之前,C 17 明確消除了此類表達式中未定義行為的可能性。

以上是C 17 中是否合法定義了「i = i 1」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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