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

C++ : How is this statement parsed?

本文关键字:何解析 语句 C++      更新时间:2023-10-16

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

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

我还研究了++a是从右到左联想的,a++是从左到右联想的。此外,+是从左到右关联。但我不明白如何将这些知识应用于这个问题。

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

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

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

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

谢谢!

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

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

解释

  • ++a 首先递增 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.

关于错误

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

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

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

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

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

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

a是内置类型时,(a++)++是非法的,如int