C:在if语句中将错误条件解释为true

时间:2014-01-26 22:12:47

标签: c if-statement conditional-statements false-positive

所以我有以下程序:

# 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。

2 个答案:

答案 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 = ii > j不会执行false。 如果您想像函数一样处理swap(i, j),请将宏定义更改为

#define swap(a,b) do {temp=a; a=b; b=temp;} while (0)