2014-01-19 74 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