2011-09-20 436 views
30

下面的代码具有我困惑操作c = a +++ b是什么意思?

int a=2,b=5,c; 
c=a+++b; 
printf("%d,%d,%d",a,b,c); 

我期望的输出为3,5,8,主要是因为一个++装置2 1,其等于3,和3 + 5等于8,所以预期的3, 5,8。事实证明,结果是3,5,7。有人可以解释为什么会出现这种情况吗?

+8

'a ++'绝对不代表'2 + 1'。 :) – jalf

+1

这些只是一本书中的练习,但他们让我思考。我一直在弄错它们,所以它不是生产代码或任何东西 – user595985

+0

除非你正在编写C++语法分析器/编译器,否则你不应该写/考虑像'a +++ b'这样的表达式,稍后有人正在阅读代码可以很容易地解释为“a +(++ b)”,它将评估为8.空格和括号是免费的,在这种情况下将使每个人的生活更轻松。 –

回答

87

它解析为c = a++ + b,并且a++意味着后递增,即增量服用a值来计算a + b == 2 + 5后。

请,从来没有写这样的代码。

+2

哪个规则说明它被解析为'a ++ + b',而不是'a ++ ++ b'?标记器是贪婪的? –

+1

我认为它必须是严格左联合的。 – Patrick87

+0

@BlagovestBuyukliev:检查你的本地C语法或[this one](http://www.lysator.liu.se/c/ANSI-C-grammar-y.html)。 –

6

一个++是递增,即表达需要的值,并然后添加 1.
C = ++ A + B会做你期望的。

1

a ++在表达式之后被评估。

c = ++ a + b;会给你你的想法。

2

这是一个糟糕的编程风格的例子。

这是相当不可读,但是其发布的增量a所以总结的a当前值b事后递增a

1

后增量运算符a ++在表达式中计算a的值后更改tge值。由于a的原始值是2,这就是用来计算c的值;在评估++之后,a的值被改变以反映新值。

1

一个++ + B ..它给出结果7和的表情值后是更新到3,因为后增量操作者

+0

a ++ + b评估为7而不是5.在你回答之前考虑。 –

+0

@ desprado07感谢您的更正:D –

39

Maximal Munch Rule适用于这样的表达的,根据该,表达被解析为:

c = a++ + b; 

即,a是后递增(a++)等被取为+操作与ba的电流值(后增量之前)。

+10

+1知道这被称为“最大的蒙克!” –

1

根据Longest Match规则,它在编译器的词法分析阶段被解析为++ ++ b。因此产生的输出。