2014-01-19 41 views
0

我目前正在學習C++,並且喜歡閱讀和探索我在互聯網上找到的程序。在C++中遞增 - 幫助理解示例程序輸出

我發現這個例子的C++代碼,這給「4大於2」作爲輸出,但我想不通爲什麼:

#include <stdio.h> 
#define MAX(a, b) (a > b) ? (a) : (b) 

int main() 
{ 
    int x = 2, y = 2; 

    if(MAX(++x, y) == x) 
    { 
     printf(" %d is greater than %d ", x, y); 
    } 

    return 0; 
} 

我不明白的是:如果你看一下該段狀態爲

if(MAX(++x, y) == x) 

它應該增加X變量1,然後調用MAX;那時X應該是3.相反,當你編譯它時,輸出如前所述。

我已經做了++運算符是如何工作的(Incrementing in C++),但我無論如何也得解決一些研究。你能解釋一下爲什麼會發生這種情況嗎?

在此先感謝您的幫助。

+0

HTTP://coliru.stacked-crooked

此外,本傑明林德利所指出的,你如果你想讓它最大的兩個值返回在這種情況下,需要圍繞宏觀額外的括號。 com/a/d7074b79ca3dd7ca – chris

+0

http://stackoverflow.com/questions/319452/are-all-macros-evil - 如果我是你,我會遠離宏的C++儘可能多。它更好地使用模板和內聯。 – Gasim

回答

5

預處理器擴展了您的條件

if((++x > y) ? (++x) : ((y) == x)) 

這增加x兩次 - ++x > y相當於3>2這樣的條件判斷爲真,導致++x再次評估。

#define MAX(a, b) ((a > b) ? (a) : (b)) 
+0

實際上,擴展是'if((++ x> y)?(++ x):(y)== x)',這是一個完全不同的表達式,因爲'=='具有比'?更高的優先級: '。 –

+0

@BenjaminLindley謝謝,我已經更正了我的答案,並添加了關於此的一個註釋。 – simonc

+1

我認爲在這種特殊情況下額外的缺陷會導致未定義的行爲,因爲'++ x'(*之後的* *?)和'x'(之後的'==')之間沒有序列點。 – mb84