C++11 标准 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf(5.17,expr.ass)指出
在所有情况下,分配都是在值计算之后排序的
右操作数和左操作数的值计算之前
赋值表达式。相对于一个
不确定顺序的函数调用,复合操作
作业是单一评估
据我了解,作为给定赋值一部分的所有表达式都将在赋值本身之前进行评估。即使我在同一个赋值中修改同一个变量两次,这条规则也应该起作用,我相当确定,这之前是未定义的行为。
请问给定的代码:
int a = 0;
a = (a+=1) = 10;
if ( a == 10 ) {
printf("this is defined");
} else {
printf("undefined");
}
总是评估为a==10
?
是的,C++98 和 C++11 之间发生了变化。我相信您的示例在 C++11 规则下定义良好,而在 C++98 规则下表现出未定义的行为。
举一个更简单的例子,x = ++x;
在 C++98 中未定义,但在 C++11 中定义良好。注意x = x++;
仍然是未定义的(后增量的副作用与表达式的求值不排序,而前增量的副作用在表达式的计算之前排序)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)