难以理解的无限后向循环C ++

时间:2016-06-03 09:04:30

标签: c++ for-loop

我是C ++的新手,我正在尝试实现一个向后循环,我创建了非常好的解决方案,但我想知道我的版本不正确并进行无限循环。

这是我创建的一个工作版本(我不明白我们如何在条件中减少i ...):

for (unsigned i = size ; i-- > 0 ; )
{
  // do stuff with i
}

这是我写的一个版本可以使用但不会降到0(这对我来说似乎更合乎逻辑):

for (unsigned i = size-1 ; i > 0 ; i--)
{
  // do stuff with i
}

如果我说例如n=10,如果我在循环中print i,我会得到此信息:

9
8
7
6
5
4
3
2
1

这里的版本对我来说更合乎逻辑,应该归零,但是提供无限循环。

for (unsigned i = size-1 ; i >= 0 ; i--)
{
  // do stuff with i
}

有人可以向我解释为什么最后一个版本不起作用,最佳选择是什么?

2 个答案:

答案 0 :(得分:5)

unsigned总是&gt; = 0.(当它达到零时,进一步减少将其设置为std::numeric_limits<unsigned>::max()

所以你的最终for循环等同于

for (unsigned i = size-1 ; true ; i--)

当然,它永远循环。

在第一个循环中,您有i-- > 0作为停止条件。当i为零时,i--表达式,其值为零(因此循环停止),尽管事实上i被设置为{{1 }}。有些人喜欢(包括我;提示downvotes)来写std::numeric_limits<unsigned>::max()并将i-->0视为幻灯片操作符。见What is the "-->" operator in C++?

答案 1 :(得分:2)

语句i >= 0始终为真,因为iunsigned,这意味着永远不会低于零。如果在i为零时减小该值,则会出现所谓的下溢,并且它将具有非常高的数字。

第一个版本肯定能完成工作,所以我会坚持下去。