为什么 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中文网其他相关文章!