所以我有以下程序:
# 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。
答案 0 :(得分:7)
这应该教会你尽可能避免使用宏,总是,总是在控制流语句中使用大括号。
宏扩展后,您的代码将显示为:
if (i > j)
temp = i;
i = j;
j = temp;
看到问题?
答案 1 :(得分:3)
这是因为在编译时swap(i, j);
被temp=a; a=b; b=temp;
取代。现在,扩展的宏看起来像
if(i > j)
temp = i;
i = j;
j = temp;
在执行时,temp = i
仅i > j
不会执行false
。
如果您想像函数一样处理swap(i, j)
,请将宏定义更改为
#define swap(a,b) do {temp=a; a=b; b=temp;} while (0)