为什么在C中永远倒数一个unsigned int循环?

时间:2011-08-14 11:11:46

标签: c loops for-loop

以下代码在infinte循环中运行。 'i'已被初始化为值1,然后与0进行比较。

因此printf()stmt应该执行一次,但它会以infinet方式运行。

unsigned int i = 1;
for (; i >= 0; i--) {
    printf("Hello: %u\n",i);
}

请解释一下这种行为。

5 个答案:

答案 0 :(得分:10)

由于iunsigned,因此不能为负数,因此i>=0始终为真。

i为零而您执行i--时,i的值会回绕unsigned int可能具有的最大值(大于零)。

您应该使用有符号整数,方法是删除unsigned修饰符。

答案 1 :(得分:7)

正如其他答案所说,这是因为它没有签名而且全部。我会告诉你一个优雅的方法来做你想做的事情 一个无符号整数。

unsigned int i=10;
while(i --> 0) printf("Hello:%u\n", i+1);

有时会将此-->称为 转到 运算符。但它实际上只是-->。如果你改变了间距,你就会得到

while( i-- > 0 )

MY2C

答案 2 :(得分:3)

这是一个unsigned int。从0减去它将产生-1。

要实现预期目标,您需要删除unsigned限定符。这将解决导致观察到的行为的integer overflow

答案 3 :(得分:1)

对于无符号整数,标准表示如果结果低于零,则加上2 ^ n,其中n是表示中的位数。

由于整数是无符号的,编译器会将其优化为无限循环。

答案 4 :(得分:1)

通过将i定义为unsigned int,您已使其成为一个始终为非负整数,因此所有可能的值i都可以具有所有正整数(在其范围内)和0因此,循环中的条件始终为真,因为i总是大于或等于0,因此它无限运行。