运算符中的c ++空格,规则是什么

时间:2017-02-10 12:11:58

标签: c++ operators spaces post-increment pre-increment

空格在这些表达式中是否有任何意义:
假设:

int a = 1;  
int b = 2;  

1)

int c = a++ +b;

或者,
2)

int c = a+ ++b;

当我在visual studio中运行这两个时,我会得到不同的结果。这是正确的行为,规范是什么? 一般来说,应该首先评估什么,后增量还是预增量?

编辑:我应该说 c =a+++b;
不在visual studio上编译。但我认为应该。似乎首先评估后缀++。

3 个答案:

答案 0 :(得分:3)

  

这是正确的行为

是的,确实如此。 Postfix ++首先返回当前值,然后递增它。所以int c = a++ +b意味着计算c的值作为当前a之间的总和(取当前值,并且仅在取之后,增加a)和b; Prefix ++首先递增当前值,然后返回已递增的值,因此在这种情况下,int c = a+ ++b表示将c计算为a与下一个表达式++b的返回值之和,这意味着b首先递增,然后返回。

  

一般来说,应首先评估,后增量或   预增量?

在这个例子中,它不是关于哪个首先被评估,而是关于每个人做什么 - 后缀首先返回值,然后递增它;前缀首先递增值,然后返回它。

H个

答案 1 :(得分:3)

也许有助于理解如何解析程序的一般架构。

简而言之,解析程序(C ++或其他)有两个阶段:词法分析器和解析器。

词法分析器获取文本输入并将其映射到符号序列。这是处理空格的原因,因为它们告诉了符号的位置。空格在某些地方非常重要(例如intc之间,不要与符号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+++btheoretically 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的预增量运算符。

原因是++的优先级高于二元加法 +。在这两种情况下,都无法将++应用于+