2012-12-26 86 views
4

我试图在for循环中比较一个无符号数与有符号数,但它没有执行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循环。我们不能比较一个无符号的数字和一个有符号的数字吗?

回答

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

-1被转换为无符号类型中用于比较的最大值。因此,对于unsigned值,

i >= -1 

仅供i = UINT_MAX如此。

为了获得预期的输出,最简单的方法是使用带符号整数,例如, int

另一种方式是做一些魔术在闭环控制:

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

但是,如果你这样做,一定要写评论解释了不寻常的闭环控制代码。

+0

i--> 0超越丑陋。 – gnasher729

+0

我应该写'我 - > 0'吗? ;) –

-1

如果将变量与尺寸进行比较,将变量声明为无符号通常是一个好主意,以避免此问题。

编译器会提供有关比较签名和未签名类型的警告,因为已签名和未签名的整数的范围不同,并且当它们相互比较时,结果可能会令人惊讶。如果您必须进行这样的比较,您应该明确地将其中一个值与其他值兼容,可能在检查后确保您正在投射的值是有效的。

相关问题