以下代码在infinte循环中运行。 'i'已被初始化为值1,然后与0进行比较。
因此printf()stmt应该执行一次,但它会以infinet方式运行。
unsigned int i = 1;
for (; i >= 0; i--) {
printf("Hello: %u\n",i);
}
请解释一下这种行为。
答案 0 :(得分:10)
由于i
为unsigned
,因此不能为负数,因此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
,因此它无限运行。