C++ 11赋值表达式是从右到左计算的吗?

Dar*_*usz 0 c++ expression expression-evaluation c++11

表达式的评估顺序一直是C++中未指定行为的来源.C++ 11标准最终是否说明评估的顺序应该是什么?

我们现在知道以下表达式的值var1var2:

int var1 =10, var2=20;
var1 = var2 = 30;
Run Code Online (Sandbox Code Playgroud)

它会是var1=30 and var2=30,还是var1=20 and var2=30

Ker*_* SB 7

不,新标准没有规定所有子表达式的评估顺序顺序.

表达式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最终成为2030使我相信,你不确定操作关联性(对=).然而,这一点从未模棱两可,并且在我能想到的所有语言变体中都得到了很好的指定.分配运算符在右侧关联,导致子表达式ab我所描述的.在C++ 11中,语言的这个(非常基础)方面没有改变.

如果您真的想要将这两个问题结合起来,则应考虑以下表达式:

var1 = 10;
(var1 = 20) = (var2 = var1);
Run Code Online (Sandbox Code Playgroud)

现在,最终的表达也是a = b,但两者ab是不平凡的子表达式,其评价是排序.


mas*_*oud 6

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)