我试图在for
循环中将无符号数与带符号数进行比较,但是在for循环后它没有执行语句,这意味着for
循环不起作用,我认为。我的代码是:
#include <stdio.h>
int main()
{
unsigned int i;
for (i = 8; i >= -1; i--)
printf ("%d\n", i);
return 0;
}
在上面的代码中,printf
语句没有被执行,所以我的for
循环出了什么问题。我们不能将无符号数与有符号数进行比较吗?
答案 0 :(得分:7)
unsigned int i;
for (i = 8 ; i >= -1; i--)
-1
将转换为无符号类型中的最大值以进行比较。因此,对于unsigned
值,
i >= -1
仅适用于i = UINT_MAX
。
要获得预期的输出,最简单的方法是使用有符号整数,例如: int
。
另一种方法是在循环控制中做一些魔术:
for(i = 8+1; i-- > 0;)
但如果你这样做,一定要写一个解释不寻常的循环控制代码的注释。
答案 1 :(得分:-1)
如果将变量与大小进行比较,将变量声明为无符号通常是个好主意,以避免出现此问题。
编译器会发出有关比较有符号和无符号类型的警告,因为有符号和无符号整数的范围不同,当它们相互比较时,结果可能会令人惊讶。如果你必须进行这样的比较,你应该明确地将其中一个值转换为与另一个值兼容,可能在检查之后确保你所投射的值是有效的。