Dar*_*usz 0 c++ expression expression-evaluation c++11
表达式的评估顺序一直是C++中未指定行为的来源.C++ 11标准最终是否说明评估的顺序应该是什么?
我们现在知道以下表达式的值var1和var2:
int var1 =10, var2=20;
var1 = var2 = 30;
Run Code Online (Sandbox Code Playgroud)
它会是var1=30 and var2=30,还是var1=20 and var2=30?
不,新标准没有规定所有子表达式的评估顺序或顺序.
表达式a + b + c在语法上被分组为(a + b) + c,但是三个子表达式a,b并且c可以以任何顺序进行评估,并且评估不相对于彼此进行排序.
为了使其更具体,请考虑:
int main()
{
return printf("Hello") + printf("World") + printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
至于你的代码:那里没有歧义.它是一个表达式,一个表单的赋值表达式a = b,其中a是左值var1并且b是子表达式var2 = 30.你想知道是否事实var1最终成为20或30使我相信,你不确定操作关联性(对=).然而,这一点从未模棱两可,并且在我能想到的所有语言变体中都得到了很好的指定.分配运算符在右侧关联,导致子表达式a和b我所描述的.在C++ 11中,语言的这个(非常基础)方面没有改变.
如果您真的想要将这两个问题结合起来,则应考虑以下表达式:
var1 = 10;
(var1 = 20) = (var2 = var1);
Run Code Online (Sandbox Code Playgroud)
现在,最终的表达也是a = b,但两者a并b是不平凡的子表达式,其评价是不排序.
var1 = var2 = 30;
Run Code Online (Sandbox Code Playgroud)
两者都应该是30标准的.未指定的是,如果赋值操作数是复杂的表达式,必须在分配之前进行评估,那么评估它们的顺序是什么?
(expr1) = (expr2) = x;
1 2
or
(expr1) = (expr2) = x;
2 1
Run Code Online (Sandbox Code Playgroud)