C++:这个语句是如何解析的?

C++ : How is this statement parsed?

我一直在尝试学习 C++ 中运算符的关联性,并且遇到了一段代码:

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

我也研究过++a是从右到左结合,a++是从左到右结合。 + 也是从左到右关联的。但是我不明白如何将这些知识应用到这个问题中。

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

我也很困惑,既然放置空格并不重要,为什么要删除这样的空格:

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

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

谢谢!

首先 space 很重要- 它有助于编译器解决歧义。

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

说明

  • ++a 首先递增 a 的值,然后 returns 引用 a 的左值,因此如果使用 a 那么它将是递增的值。

在你的例子中,总共有两个++a,因此a的值将增加到12,从而分配给a。所以表达式中的所有 a 都将保持值 12,从而为您提供 c=48.

的值
  • a++先returns一个值为a的右值,也就是旧值,然后在下一个完整表达式之前的某个未指定的时间递增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.

关于错误

表达式中没有 space,编译器在解析表达式时会感到困惑,因此没有任何值来进行赋值。

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

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

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

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

((a++)++) + (a++) + a + a
a 是内置类型时

(a++)++ 是非法的 int