抱歉可能有一个愚蠢的问题。 我的循环不会停在0,我不知道为什么。
此循环将在i = 1
处停止for (unsigned int i = 3 ; i > 0 ; i--)
而这将停留在i = 4294967295而不是
for (unsigned int i = 3 ; i >= 0 ; i--)
为什么呢?我错过了什么吗?
答案 0 :(得分:5)
实际上,unsigned int的i >= 0
始终为true。所以你不能用它作为循环不变量。
请改用:
for (unsigned int i = 4 ; i-- > 0 ;)
println(i);
它将打印3,2,1,0
答案 1 :(得分:2)
for
循环迭代,直到中断条件计算为false
。
在你的情况下,循环将反复检查:
是i>0
(i>=0
分别)true
?如果是这样,执行body并递减i
,否则跳过循环体。
您的第一个循环将在某个时刻到达i=1
。 i>0
将评估为true
。正文将被执行,i
将被递减。 i
将为0. i>0
将评估为false
并且正文将不会执行,您将突破循环。
你的第二个循环不会停止(用g ++测试)。为什么?您的i
将达到0. i>=0
将评估为true。正文将被执行,i
将被递减。但是,由于您使用的是unsigned int
,因此会将{42}分配给i
。从4294967295>=0
开始,循环将继续,再次达到0并再次将4294967295分配给i
,从而无限期地执行。
这是因为unsigned int表示0,因为二进制中的所有0并从中减去1将产生所有1,这被解释为4294967295。
如何避免这个问题?正如评论中所提到的,一个简单的方法是使用int
而不是unsigned int
。