以C+递增+;-帮助理解示例程序输出 我目前正在学习C++,我喜欢阅读和探索我在网上找到的程序。p> 我找到了这个例子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; }

以C+递增+;-帮助理解示例程序输出 我目前正在学习C++,我喜欢阅读和探索我在网上找到的程序。p> 我找到了这个例子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; },c++,integer,C++,Integer,它应该将X变量增加1,然后调用MAX;此时X应该是3。相反,当您编译它时,输出是如上所述的 我已经做了一些关于++操作符如何工作()的研究,但我还是无法得到解决方案。你能解释一下为什么会这样吗 提前感谢您的帮助。预处理器将您的条件扩展到 if( ( ++x > y ) ? (++x) : ((y) == x)) 这会将x增加两次-++x>y相当于3>2,因此该条件的计算结果为true,从而再次计算++x 此外,正如Benjamin Lindley指出的,如果希望宏在本例中返回最多两个值,

它应该将X变量增加1,然后调用MAX;此时X应该是3。相反,当您编译它时,输出是如上所述的

我已经做了一些关于++操作符如何工作()的研究,但我还是无法得到解决方案。你能解释一下为什么会这样吗


提前感谢您的帮助。

预处理器将您的条件扩展到

if( ( ++x > y ) ? (++x) : ((y) == x))
这会将
x
增加两次-
++x>y
相当于
3>2
,因此该条件的计算结果为true,从而再次计算
++x

此外,正如Benjamin Lindley指出的,如果希望宏在本例中返回最多两个值,则需要在宏周围加上括号:

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

预处理器将您的条件扩展为

if( ( ++x > y ) ? (++x) : ((y) == x))
这会将
x
增加两次-
++x>y
相当于
3>2
,因此该条件的计算结果为true,从而再次计算
++x

此外,正如Benjamin Lindley指出的,如果希望宏在本例中返回最多两个值,则需要在宏周围加上括号:

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

如果我是你,我会尽量远离C++中的宏。最好使用模板和内联线如果我是你,我会尽量远离C++中的宏。使用模板和内联线更好。实际上,扩展是
如果(++x>y)?(++x):(y)==x)
,这是一个完全不同的表达式,因为
==
的优先级高于
?:
@BenjaminLindley谢谢,我已经更正了我的答案,并添加了一条关于这一点的注释。我认为额外的偏执会导致这种特殊情况下的未定义行为,因为在
++x
(在
之后)和
x
(在
=
之后)之间没有序列点。这就是为什么
std::max()
及其朋友们。非常感谢大家,现在有道理了;我没有考虑“#define”行为。实际上,扩展是
如果(++x>y)?(++x):(y)==x)
,这是一个完全不同的表达式,因为
==
的优先级高于
?:
@BenjaminLindley谢谢,我已经更正了我的答案,并添加了一条关于这一点的注释。我认为额外的偏执会导致这种特殊情况下的未定义行为,因为在
++x
(在
之后)和
x
(在
=
之后)之间没有序列点。这就是为什么
std::max()
及其朋友们。非常感谢大家,现在有道理了;我没有想到“定义”行为。