0

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

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

我还研究了++a从右到左的联想和a++从左到右的联想。也是+从左到右关联的。但我不明白如何在这个问题中应用这些知识。

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

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

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

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

谢谢!

4

2 回答 2

2

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

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

解释

  • ++a首先增加a的值,然后返回引用a的左值,所以如果使用a,那么它将是增加的值。

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

  • a++ 首先返回一个值为 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.

关于错误

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

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

于 2016-03-23T08:09:48.827 回答
2

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

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

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

((a++)++) + (a++) + a + a

并且当是内置类型(a++)++时是非法的 as 。aint

于 2016-03-23T09:41:59.407 回答