我一直在努力学习C ++中运算符的关联性,但我遇到了一段代码:
int a = 10;
int C = a++ + ++a + ++a +a;
我还研究过++a
从右到左是关联的,a++
从左到右是关联的。此外+
从左到右关联。但我不明白如何在这个问题上运用这些知识。
我很困惑我的编译器如何解析这个语句?
我也很困惑,因为放置空间并不重要,为什么要删除空格,如:
int C = a+++++a+++a+a; //error: lvalue required as increment operand
生成错误? 请帮我理解这个概念。
谢谢!
答案 0 :(得分:2)
首先空间确实重要 - 它有助于编译器解决歧义。
只要有表达式,编译器就会从右到左解析它。它首先查找所有后增量运算符,然后查找预增量运算符,因为后者的优先级低于前者。因此,预增量运算符所做的任何修改都将应用于整个表达式,然后将在下一个表达式中应用后增量的更改。
<强>解释强>
在你的情况下,总共有两个++ a,因此a的值将增加到12,因此分配给a。所以表达式中的所有a都将保持值12,给出c = 48的值。
在你的情况下,如果你在表达式之后使用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
是非法的。