是一个C++;11赋值表达式从右向左求值? 的表达式顺序一直是C++中未指定行为的来源。C++11标准是否最终规定了评估的顺序
现在我们知道以下表达式的是一个C++;11赋值表达式从右向左求值? 的表达式顺序一直是C++中未指定行为的来源。C++11标准是否最终规定了评估的顺序,c++,c++11,expression,expression-evaluation,C++,C++11,Expression,Expression Evaluation,现在我们知道以下表达式的var1和var2的值了吗: int var1 =10, var2=20; var1 = var2 = 30; var1 = 10; (var1 = 20) = (var2 = var1); 是var1=30和var2=30,还是var1=20和var2=30?否,新标准没有规定所有子表达式求值的顺序或顺序 表达式a+b+c在语法上被分组为(a+b)+c,但是三个子表达式a、b和c可以按任何顺序求值,并且求值之间没有顺序 要使其更具体,请考虑: int main()
var1
和var2
的值了吗:
int var1 =10, var2=20;
var1 = var2 = 30;
var1 = 10;
(var1 = 20) = (var2 = var1);
是
var1=30和var2=30
,还是var1=20和var2=30
?否,新标准没有规定所有子表达式求值的顺序或顺序
表达式a+b+c
在语法上被分组为(a+b)+c
,但是三个子表达式a
、b
和c
可以按任何顺序求值,并且求值之间没有顺序
要使其更具体,请考虑:
int main()
{
return printf("Hello") + printf("World") + printf("\n");
}
至于你的代码:这里没有歧义。它是一个表达式,
a=b
形式的赋值表达式,其中a
是左值var1
,b
是子表达式var2=30
。您想知道var1
最终是20
还是30
这一事实让我相信您不确定运算符的关联性(对于=
)。然而,这从来都不是含糊不清的,在我能想到的所有语言变体中都有很好的规定。assignment操作符在右侧关联,导致我描述的子表达式a
和b
。该语言的这一(极其基本的)方面在C++11中没有改变
如果你真的想把这两个问题结合起来,你应该考虑下面的表达式:
int var1 =10, var2=20;
var1 = var2 = 30;
var1 = 10;
(var1 = 20) = (var2 = var1);
现在,最后的表达式也是a=b
,但是a
和b
都是非平凡的子表达式,它们的求值是不有序的
两者均应为30
,并由标准规定。未指定的是,如果赋值操作数是复杂表达式,必须在赋值之前求值,那么求值顺序是什么
(expr1) = (expr2) = x;
1 2
or
(expr1) = (expr2) = x;
2 1
赋值运算符(=)和复合赋值运算符都从右向左分组
这并没有告诉我们任何关于评估顺序的信息。这仅仅意味着a=b=c
被解析为a=(b=c)
,而不是(a=b)=c
1.9/15
仍然适用:
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的求值是不排序的
排序规则只引入偏序。在这样的表达中:
(x+42) = (y+42)
可以保证在对(x+42)的结果进行赋值之前,执行两个子表达式
(x+42)
和(y+42)
,但这两个子表达式本身不排序。其中一个可以在另一个之前执行,它们甚至可以交错执行,并且在程序执行过程中顺序不必一致。@Dariusz:代码也与实际问题无关。@KerrekSB这是我的问题,我知道我想问什么。虽然我在表达我的意思时可能有问题,但代码仍然有效。你的回答与我打算发布的内容无关。@Dariusz:胡说。您询问的是表达式求值的顺序,而您发布的代码与此无关。您发布的表达式是a=b
,其中b
是var2=30
,具有值30
,a
是var1
,是左值。排序与此表达式的求值结果无关。@Dariusz:给出一个不同的观点:您似乎混淆了语法问题(运算符关联性,它决定了如何解析源代码)和表达式求值的抽象规则。这里没有什么模棱两可的。这个问题一开始是无效的。我还没有正确表达我想问的问题,这次我想从头开始正确地创建问题,并获得一个未编辑10次的问题的真实答案。请删除这个。它一直都是吗?现在计算这些复杂表达式的顺序是什么?我们不知道顺序,标准也没有规定。问题是关于=
(从右到左),而不是+
(从左到右)。请看@jrok,OP似乎对某些事情感到困惑,因此答案应该尝试解决这一问题并提供帮助,而不是增加困惑。我没有否决这个答案,因为正如你所说的,它解决了相同的基本点,但它仍然不是一个好的答案——你的答案更好,这就是为什么我否决了你的答案。@DanielFrey:这是关联性,而不是优先性。我已经添加了一段描述OP代码的段落。+1现在有一些有用的东西,是的,你是正确的,这是关联性,而不是优先级。