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
生成错误?请帮助我理解这个概念。
谢谢!
首先,空间确实很重要 - 它有助于编译器解决歧义。
每当有表达式时,编译器都会从右到左解析它。它首先查找所有后递增运算符,然后查找前增量运算符,因为后面的优先级低于前者。因此,前增量运算符所做的任何修改都将应用于整个表达式,然后后增量的更改将应用于下一个表达式。
解释
- ++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
。
相关文章:
- 继承函数的重载解析
- 基类中的函数名称解析
- 提升精神:解析布尔表达式并简化为规范范式
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 我的简单if-else语句是如何无法访问的代码
- 增强精神解析器规则以检测语句中的特殊结尾
- 错误:语句无法解析重载函数C++的地址
- 这个语句到底是什么意思 stack<int, list<int> > 它与 stack 有何不同<int>?
- 这些 if 语句会在编译时解析吗?
- 语句无法解析过载函数C 指标的地址
- 使用 if/then 语句解析 C++ 中的 argv[ ] 选项
- 通过解析文件构建逻辑语句
- C++错误:语句无法解析重载函数的地址
- C++ :这个语句是如何解析的
- C++ if 语句不解析空格
- 编译器告诉我它无法解析重载函数的地址.对于 switch() 语句,这意味着什么
- 尝试使用 Boost-Spirit 解析类似 SQL 的语句
- 语句无法解析重载函数的地址
- 有什么比单个 if 语句负载更好的方法来解析大量案例?
- POCO C++SAX解析器:如果xml文档编码是ANSI,那么下一条语句不是读取并抛出编码错误异常