所以我有以下程序:
# 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,条件也被执行为“真”。
所以我有以下程序:
# 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,条件也被执行为“真”。
这应该教您尽可能避免使用宏,并且始终在控制流语句中始终使用大括号。
宏扩展后,您的代码将显示为:
if (i > j)
temp = i;
i = j;
j = temp;
看到问题了吗?
这是因为在编译时swap(i, j);
被temp=a; a=b; b=temp;
. 现在扩展的宏看起来像
if(i > j)
temp = i;
i = j;
j = temp;
只有在执行temp = i
时不会执行 for i > j
to be false
。
如果你想像swap(i, j)
一个函数一样对待,那么将你的宏定义更改为
#define swap(a,b) do {temp=a; a=b; b=temp;} while (0)