c++空间中的运算符,有什么规则
c++ spaces in operators , what are the rules
空格在以下表达式中有任何含义吗:
假设:
int a = 1;
int b = 2;
1)
int c = a++ +b;
或者,
2)
int c = a+ ++b;
当我在visualstudio中运行这两个时,我会得到不同的结果。这是正确的行为吗?规范上说了什么
一般来说,应该首先评估什么,增量后还是增量前?
编辑:我应该说c =a+++b;
不在visual studio上编译。但我认为应该这样。后缀++似乎是首先评估的。
这是的正确行为吗
是的。Postfix ++
首先返回当前值,然后将其递增。因此int c = a++ +b
意味着计算c的值,作为当前a(取当前a值,取后递增a)与b之和;Prefix ++
首先递增当前值,然后返回已经递增的值,因此在这种情况下,int c = a+ ++b
意味着计算c作为a和下一个表达式++b
的返回值之和,这意味着b首先递增,然后返回。
一般来说,应该首先评估什么,增量后或增量前?
在这个例子中,不是关于哪个先被求值,而是关于每个先做什么-postfix先返回值,然后递增;前缀首先增加值,然后返回。
Hth
也许这有助于理解程序解析的一般架构。
简而言之,解析程序(C++或其他程序)有两个阶段:lexer和解析器。
lexer接受文本输入并将其映射到符号序列。这是处理空格的时候,因为空格告诉符号在哪里。空间在某些地方确实很重要(比如int
和c
之间,以免与符号intc
混淆),但在其他地方则不重要(比如在a
和++
之间,因为没有模糊性来分隔它们)。
第一个例子:
int c = a++ +b;
给出了以下符号,每个符号都在自己的行上(当然,实现方式可能会略有不同):
int
c
=
a
++
+
b
;
而在另一种情况下:
int c = a+ ++b;
符号是:
int
c
=
a
+
++
b
;
解析器然后根据一些语法,用符号构建一个树(抽象语法树,AST)。特别地,根据C++语法,作为加法的+
的优先级低于一元++
运算符(无论后缀或前缀如何)。这意味着第一个示例在语义上与(a++) + b
相同,而第二个示例类似于a+ (++b)
。
对于您的示例,AST将有所不同,因为这些空间在lexer阶段已经导致了不同的输出。
请注意,++
和+
之间不需要空格,因此理论上a+++b
是可以的,但为了可读性,不建议这样做。因此,由于技术原因,一些空格很重要,而另一些空格对我们用户阅读代码很重要。
是的,它们应该不同;行为是正确的
你的困惑可能有几个原因。
这个问题与"运算符中的空格"无关。您有不同的运算符。如果您要删除空间,您会有不同的问题。查看c++中的i+++增量是什么
它也不是关于"应该首先评估什么,增量后还是增量前"。这是关于理解增量后和增量前之间的差异。
- 两者都会递增它们所应用的变量
- 但是增量后表达式返回增量前的值
- 而递增前表达式在递增后返回值
即
//Given:
int a = 1;
int b = 2;
//Post-increment
int c = a++ +b; =>
1 + 2; (and a == 2) =>
3;
//Pre-increment
int c = a+ ++b; =>
1 + 3; (and b == 3) =>
4;
另一件可能会引起混乱的事情。您写道:a++ +b;
。您可能假设+b
是一元+
运算符。这将是一个不正确的假设,因为您同时有左和右操作数,使+
成为二进制加法运算符(如x + y
)。
最后可能的混淆。你可能想知道为什么:
- 在
a++ +b
中,++
是应用于a
的后增量算子 - 而在CCD_ 27中,它是应用于CCD_
原因是++
的优先级高于二进制添加剂+
。并且在这两种情况下都不可能将++
应用于+
。
- 为什么此指针值不能转换为整数的规则是什么?
- 指针算术规则中的"possibly-hypothetical"是什么意思?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 在 C++20 中对概念约束函数进行排序的规则是什么?
- 朋友声明的复杂范围界定规则有什么意义?
- 模板模板参数:以下示例中应用了什么规则
- 自动参数捕获的扣除规则是什么?
- 高完整性C++规则7.2.1的基本原理是什么
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 在平等符号左侧使用RVALUE参考的规则是什么?
- 有什么方法可以在 GNU Make 中使用变量作为规则和先决条件?
- 类静态变量初始化的规则是什么?
- 初始化中的模板转换运算符类型推导规则是什么?
- 将临时值存储为某种数据类型时,算术运算的标准规则是什么
- c++空间中的运算符,有什么规则
- 关于实施其中之一的CPP,这三个规则究竟是什么?
- 使用“void”来专门化模板的规则是什么?
- 对于C++,在另一个函数中定义一个函数的可行性规则是什么?
- 为了确保C 类型是POD,我必须遵循什么规则