c++空间中的运算符,有什么规则

c++ spaces in operators , what are the rules

本文关键字:什么 规则 运算符 空间 c++      更新时间:2023-10-16

空格在以下表达式中有任何含义吗:
假设:

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接受文本输入并将其映射到符号序列。这是处理空格的时候,因为空格告诉符号在哪里。空间在某些地方确实很重要(比如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将有所不同,因为这些空间在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_

原因是++的优先级高于二进制添加剂+。并且在这两种情况下都不可能将++应用于+