i = i++
C ++ 17具有明确定义的行为。查看评论和答案。为什么变成6为什么不应该变成5?在另一个方面,输出为5,但在Visual Studio中为6
#include<stdio.h>
int main(){
int i = 5;
i = i++;
printf("%i", i);
}
在直到2014年(包括该版本)的标准C ++中,该表达式i = i++
具有未定义的行为,因为该对象i
被修改了两次,并且两个修改都没有顺序。
2017版(C ++ 17)对表达评估的描述进行了一些更改。C ++ 17 4.6 [intro.execution]中的一个示例说:
void g(int i) {
i = 7, i++, i++; // i becomes 9
i = i++ + 1; // the value of i is incremented
i = i++ + i; // the behavior is undefined
i = i + 1; // the value of i is incremented
}
许多阅读该代码的人都会假设行为i = i++
不确定。实际上,如果您的编译器正确实现了C ++ 17(并且您以告诉其符合C ++ 17的方式(例如,-std=c++17
对于gcc或clang)调用了它),则i
赋值after的值将为5
。但是对于符合较早版本的C ++或以不符合标准的模式调用的编译器,其行为仍未定义。
我会注意到g++ -std=c++17 -Wall
(i = i++
尽管大约一个星期前从最新的gcc来源构建而成)仍可能未定义警告,尽管运行程序仍会产生C ++ 17正确的结果。
您正在使用的编译器很可能不符合C ++ 17。
更普遍地说,i = i++
除了作为对编译器一致性的测试之外,确实没有充分的理由来编写。在兼容的C ++ 17(或更高版本)编译器中,它什么也不做。评估会i++
产生的先前值,i
并且作为副作用产生更新i
-但更新后的值会被分配覆盖。
(在C中,i = i++
仍然具有未定义的行为。)
(我欢迎任何阅读过C ++ 14和C ++ 17标准并可以引用暗示这一变化的规范性文本的人的评论。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句