使用带有参数的宏时得到意想不到的结果

问题描述 投票:0回答:1
#include <stdio.h>
#define big(a, b) a > b ? a : b
#define swap(a, b) temp = a; a = b; b = temp;

int main() {
    int a = 3, b = 5, temp = 0;
    if ((3 + big(a, b)) > b)
        swap(a, b);
    printf("%d %d", a, b);
}

以上代码是在多项选择题中给出的。 我预计答案是 5 3。运行代码时,输出结果是 5 0。我试图理解这一点,但我的努力是徒劳的。这段代码的作用是什么?

c macros swap preprocessor-directive
1个回答
0
投票

只需展开代码中的宏即可得到

int main() {
    int a = 3, b = 5, temp = 0;
    if ((3 + a > b ? a : b ) > b)
        temp = a;
    a = b;
    b = temp;    
    printf("%d %d", a, b);
}

由于条件运算符中的第一个表达式等于 6,因此条件运算符的结果是 a 小于 b 的值。

因此 if 语句的条件 eva 逻辑 false 并且该语句

temp = a;

被跳过。

结果 a 将等于 5,b 将等于 0。

您需要使用括号。例如

#define big(a, b) ( ( a ) > ( b ) ? ( a ) : ( b ) )
#define swap(a, b) do { temp = ( a ); ( a ) = ( b ); ( b ) = temp; } while ( 1 )
© www.soinside.com 2019 - 2024. All rights reserved.