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
。
我一直在尝试学习 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
。