2013-02-01 38 views
0

可能重複:
What’s the side effect of the following macro in C ? Embedded C最新的輸出?

什麼將是以下的輸出:

#include <stdio.h> 
#define MAN(x,y) ((x) < (y))?(x):(y) 
main() 
{ 
    int i=10,j=5,k=0; 
    k= MAN(i++,++j); 
    printf("%d %d %d" ,i,j,k); 
} 

在這裏,我認爲,MAN(10,6)將被調用,輸出將是:

11 6 6 

但是輸出

11 7 7 

能有人請解釋這一點。

+2

@chris這是無關的。我們不在這裏添加任何東西或者分配'x = x ++'。 – JJJ

+0

@Xeo它*不是*同一件事。 OP的代碼基本上是'if(i ++> ++ j){k = ++ j; }'。序列是明確的。 – JJJ

+0

沒關係。我忘記了那裏有一個序列點。 *第一個操作數被評估;在其評估和第二或第三操作數的評估之間有一個順序點(以評估者爲準)。第二個操作數 僅在第一個比較不等於0時才被評估;第一個操作數僅在 第一個比較等於0時計算;結果是第二或第三操作數 (無論哪個被評估)的值,轉換爲下面描述的類型。 110)* – chris

回答

4

記住宏是如何工作的。他們完全按照原樣替換文本,並且不像你期望的函數那樣評估他們的爭論。

k= MAN(i++,++j); 

實際上

k= ((i++) < (++j))?(i++):(++j) 

是,這是爲什麼j遞增兩次。

+2

+1 ...我很討厭知道答案的感覺,但是輸入得慢一些:) – ppeterka

+0

@ppeterka也發生過幾次。 –

+0

我確定 - 看到你的代表。這只是一個愚蠢的人的事情,感覺糟糕的速度取代感覺'嘿,至少我知道這個'的正確答案:) – ppeterka

1

你可以簡單地亞:X < - 我++,Y < - ++Ĵ到您的宏限定,那麼你就可以看到

((i++) < (++j))?(i++):(++j) 

我++和++ j是在做比較時都執行;因爲比較返回false,++Ĵ將因此執行你得到的結果

0

成爲

我++ < ++ J&prime;我++:++Ĵ

我將不大於j,所以我們使用第二個參數

所以我們做一個我++ ++和j和另一++Ĵ

所以10 + 1 = 11 5 + 1 + 1 = 7,並返回第二自變量..... 7

+0

剛看了一眼,你說得對。傷害撤消。 –

0

由於MAN是而非函數,此代碼:

k = MAN(i++,++j); 

含義:

k = ((i++) < (++j))?(i++):(++j) 

所以,j被遞增兩次:一次是在<測試,並再次當(++j)進行評估。如果MAN函數而不是宏,則會傳遞遞增的,而不是表達式本身,並且您的答案將成爲您的預期。

0

在宏它不計算值,並將它傳遞只需更換標誌,使其成爲這樣

MAN(i++,++j) ((i++) < (++j))?(i++):(++j) 

所以這裏的一些事情++Ĵ執行兩次,答案就11,7,7