[英]Is a C++11 assignment expression evaluated right to left?
表达式的求值顺序一直是C ++中未指定行为的来源。 C ++ 11标准是否最终规定了评估的顺序?
现在我们是否知道以下表达式的var1
和var2
的值:
int var1 =10, var2=20;
var1 = var2 = 30;
是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");
}
至于您的代码:那里没有歧义。 它是一个表达式,形式为a = b
的赋值表达式,其中a
是左值var1
, b
是子表达式var2 = 30
。 您想知道var1
是20
还是30
的事实使我相信您不确定运算符的关联性(for =
)。 但是,这从来都不是模棱两可的,并且在我能想到的所有语言变体中都得到了很好的说明。 分配运算符在右侧关联,导致我已经描述了子表达式a
和b
。 在C ++ 11中,语言的这一方面(极其基础)没有更改。
如果您确实想将两个问题结合在一起,则应考虑以下表达式:
var1 = 10;
(var1 = 20) = (var2 = var1);
现在,最终表达式也是a = b
,但是a
和b
都是非平凡的子表达式,其求值没有顺序。
var1 = var2 = 30;
两者均应为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)
,但是两个子表达式本身未排序。 任一个都可以在另一个执行之前执行,甚至可以交错执行,并且在执行程序期间顺序不必保持一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.