4

我试图在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循环有什么问题。我们不能将无符号数与有符号数进行比较吗?

4

2 回答 2

7
unsigned int i;
for (i = 8 ; i >= -1; i--)

-1转换为无符号类型的最大值以进行比较。因此,对于unsigned值,

i >= -1

仅适用于i = UINT_MAX

要获得预期的输出,最简单的方法是使用有符号整数,例如int.

另一种方法是在循环控制中做一些魔术:

for(i = 8+1; i-- > 0;)

但是如果你这样做,一定要写一个注释来解释异常循环控制代码。

于 2012-12-26T06:41:10.200 回答
-1

如果将变量与大小进行比较,通常最好将变量声明为无符号,以避免此问题。

编译器会在比较有符号和无符号类型时发出警告,因为有符号和无符号整数的范围不同,当它们相互比较时,结果可能会令人惊讶。如果您必须进行这样的比较,您应该明确地转换其中一个值以与另一个兼容,也许在检查以确保您转换的值有效之后。

于 2012-12-26T06:43:04.340 回答