空格在这些表达式中是否有任何意义:
假设:
int a = 1;
int b = 2;
1)
int c = a++ +b;
或者,
2)
int c = a+ ++b;
当我在visual studio中运行这两个时,我会得到不同的结果。这是正确的行为,规范是什么? 一般来说,应该首先评估什么,后增量还是预增量?
编辑:我应该说
c =a+++b;
不在visual studio上编译。但我认为应该。似乎首先评估后缀++。
答案 0 :(得分:3)
这是正确的行为
是的,确实如此。
Postfix ++
首先返回当前值,然后递增它。所以int c = a++ +b
意味着计算c的值作为当前a之间的总和(取当前值,并且仅在取之后,增加a)和b;
Prefix ++
首先递增当前值,然后返回已递增的值,因此在这种情况下,int c = a+ ++b
表示将c计算为a与下一个表达式++b
的返回值之和,这意味着b首先递增,然后返回。
一般来说,应首先评估,后增量或 预增量?
在这个例子中,它不是关于哪个首先被评估,而是关于每个人做什么 - 后缀首先返回值,然后递增它;前缀首先递增值,然后返回它。
H个
答案 1 :(得分:3)
也许有助于理解如何解析程序的一般架构。
简而言之,解析程序(C ++或其他)有两个阶段:词法分析器和解析器。
词法分析器获取文本输入并将其映射到符号序列。这是处理空格的原因,因为它们告诉了符号的位置。空格在某些地方非常重要(例如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将是不同的,因为空格已经在词法分析阶段导致不同的输出。
请注意,++
和+
之间不需要空格,因此a+++b
会theoretically be fine,但不建议这样做以提高可读性。因此,出于技术原因,某些空间很重要,而其他空间对于我们的用户来说非常重要。
答案 2 :(得分:2)
是的,他们应该是不同的;行为是正确的 您可能会有一些可能的混淆源。
这个问题不是关于"运营商的空间"。你有不同的运营商。如果你删除空间,你会有一个不同的问题。见What is i+++ increment in c++
它也不是关于"应该首先评估什么,后增量或预增量"。它是关于理解后增量和预增量之间之间的区别。
即。
//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
的后增量运算符。a+ ++b
中,它是一个应用于b
的预增量运算符。原因是++
的优先级高于二元加法 +
。在这两种情况下,都无法将++
应用于+
。