為什麼i = i 1;在C 17 變得合法
在C 11 中,程式碼片段「i = i 1; ”調用未定義的行為。然而,在 C 17 中,這段程式碼在法律上變得可接受。這項變更源自於 C 17 中引入的增強排序保證。
根據 C 11 標準 [N3337 basic.exec],除非明確指定,否則副作用的排序是不排序的。在範例程式碼中,賦值運算子 (=) 和後綴自增運算子 ( ) 都有副作用,如果排序不正確,可能會導致未定義的行為。
在C 17 中,在[ 中加入了一個新句子N4659 expr.ass] 闡明了賦值運算子的排序規則:
The right operand is sequenced before the left operand.
此附加語句確保右邊操作數中的所有副作用在左操作數中的任何副作用(包括賦值)之前執行
在“i = i 1;”的情況下,右操作數(i 1) 由後綴增量運算符(i ) 和常數1 組成。 C 17 中引入的排序保證確保執行後綴增量,其副作用發生在執行賦值之前。這消除了 C 11 中存在的未定義行為。
因此,C 17 中增強的排序保證使得「i = i 1;」透過確保右操作數和左操作數的副作用正確排序,防止未定義的行為,這是合法的。
以上是為什麼「i = i 1;」在C 17中成為合法操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!