2011-09-20 530 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。因此產生的輸出。