1

所以我有以下程序:

# define swap(a,b) temp=a; a=b; b=temp; 

int main() {
int i, j, temp;
i = 5;
j = 10;
temp = 0;
if (i > j)
    swap(i, j);
printf("%d %d %d", i, j, temp);
}

这导致:

10, 0, 0

我不明白为什么if (5 > 10)即使 5 不大于 10,条件也被执行为“真”。

4

2 回答 2

7

这应该教您尽可能避免使用宏,并且始终在控制流语句中始终使用大括号

宏扩展后,您的代码将显示为:

if (i > j)
    temp = i;
i = j;
j = temp;

看到问题了吗?

于 2014-01-26T22:15:03.220 回答
3

这是因为在编译时swap(i, j);temp=a; a=b; b=temp;. 现在扩展的宏看起来像

 if(i > j)
    temp = i;
    i = j;
    j = temp;  

只有在执行temp = i时不会执行 for i > jto be false
如果你想像swap(i, j)一个函数一样对待,那么将你的宏定义更改为

#define swap(a,b) do {temp=a; a=b; b=temp;} while (0) 
于 2014-01-26T22:15:03.720 回答