C 17 中i = i 1 的合法性
C 17 引入了一個微妙但重大的變化,使表達式i = i 1 合法化; ,這是先前在C 11 中未定義的行為。
在C 17 之前
在C 11 中,賦值表達式的求值順序指定如下:
在 i = i 1; 的情況下,這意味著使用後綴運算子遞增 i 的副作用可能發生在賦值之前或之後。缺乏排序導致了未定義的行為。
C 17 中的變更
C 17 在賦值運算子的規格中引入了附加句子:「正確的運算元是在左運算元之前排序。 」這個看似無害的添加具有深遠的影響。
透過在 LHS 之前對 RHS 進行排序,C 17 現在可以確保 RHS 中的任何副作用都保證在分配本身之前發生。這有效地將賦值操作與任何潛在的未定義行為隔離。
重寫範例
為了說明這項更改,讓我們分解i = i 1; 的計算;在C 17 中:
右操作數(RHS)的值計算:i 1
RHS 排序在LHS 之前:
左操作數(LHS)的值計算:i
賦值:
透過確保所有副作用RHS 在賦值之前,C 17 明確消除了此類表達式中未定義行為的可能性。
以上是C 17 中是否合法定義了「i = i 1」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!