C ++:如何解析此语句?

时间:2016-03-23 06:06:47

标签: c++ operators associativity

我一直在努力学习C ++中运算符的关联性,但我遇到了一段代码:

int a = 10;
int C = a++ + ++a + ++a +a;

我还研究过++a从右到左是关联的,a++从左到右是关联的。此外+从左到右关联。但我不明白如何在这个问题上运用这些知识。

我很困惑我的编译器如何解析这个语句?

我也很困惑,因为放置空间并不重要,为什么要删除空格,如:

int C = a+++++a+++a+a;  //error: lvalue required as increment operand

生成错误? 请帮我理解这个概念。

谢谢!

2 个答案:

答案 0 :(得分:2)

首先空间确实重要 - 它有助于编译器解决歧义。

只要有表达式,编译器就会从右到左解析它。它首先查找所有后增量运算符,然后查找预增量运算符,因为后者的优先级低于前者。因此,预增量运算符所做的任何修改都将应用于整个表达式,然后将在下一个表达式中应用后增量的更改。

<强>解释

  • ++第一个增加a的值然后返回参考a的左值,所以如果使用a则它将是递增的值。

在你的情况下,总共有两个++ a,因此a的值将增加到12,因此分配给a。所以表达式中的所有a都将保持值12,给出c = 48的值。

  • a ++首先返回一个值为a的rvalue,即旧值,然后在下一个完整表达式之前的未指定时间递增a。

在你的情况下,如果你在表达式之后使用a的值,它将是13,就像在前一个表达式中一样只有一个a ++。

例如。

int a = 10;
int C = a++ + ++a + ++a +a; // Here a=12 and the post increment effect will be applied in the next expression
int B = a + a; // Here a=13 the effect of previous post increment.

关于错误

如果表达式中没有空格,编译器在解析表达式时会感到困惑,因此不需要任何值来进行赋值。

PS:左值是一个可以作为作业目标的值。 在C / C ++中,预增量(减量)和后增量(减量)运算符需要L值表达式作为操作数。提供R值或const限定变量会导致编译错误。

答案 1 :(得分:2)

抛开它会导致UB的事实(因为同一变量的这些多个增量之间没有序列点)

a+++++a+++a+a

被解析(因为解析器是贪婪的)

((a++)++) + (a++) + a + a
(a++)++作为a的内置类型时,

int是非法的。