因为循环不会在零索引处停止

时间:2015-04-12 00:45:12

标签: c++ loops

抱歉可能有一个愚蠢的问题。 我的循环不会停在0,我不知道为什么。

此循环将在i = 1

处停止
for (unsigned int i = 3 ; i > 0 ; i--)

而这将停留在i = 4294967295而不是

for (unsigned int i = 3 ; i >= 0 ; i--)

为什么呢?我错过了什么吗?

2 个答案:

答案 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>0i>=0分别)true?如果是这样,执行body并递减i,否则跳过循环体。

您的第一个循环将在某个时刻到达i=1i>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