繁体   English   中英

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

[英]Is a C++11 assignment expression evaluated right to left?

表达式的求值顺序一直是C ++中未指定行为的来源。 C ++ 11标准是否最终规定了评估的顺序?

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

int var1 =10, var2=20;
var1 = var2 = 30;

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

不可以,新标准未指定所有子表达式的评估顺序排序。

表达式a + b + c在语法上被分组为(a + b) + c ,但是三个子表达式abc可以按任意顺序求值,并且求值没有相对于彼此排序。

为了更具体一点,请考虑:

int main()
{
    return printf("Hello") + printf("World") + printf("\n");
}

至于您的代码:那里没有歧义。 它是一个表达式,形式为a = b的赋值表达式,其中a是左值var1b是子表达式var2 = 30 您想知道var120还是30的事实使我相信您不确定运算符的关联性(for = )。 但是,这从来都不是模棱两可的,并且在我能想到的所有语言变体中都得到了很好的说明。 分配运算符在右侧关联,导致我已经描述了子表达式ab 在C ++ 11中,语言的这一方面(极其基础)没有更改。

如果您确实想将两个问题结合在一起,则应考虑以下表达式:

var1 = 10;
(var1 = 20) = (var2 = var1);

现在,最终表达式也是a = b ,但是ab都是非平凡的子表达式,其求值没有顺序。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM