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

Kev*_*n M 1 c++ for-loop

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

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

for (unsigned i = size ; i-- > 0 ; )
{
  // do stuff with i
}
Run Code Online (Sandbox Code Playgroud)

这是我写的一个版本,它可以工作,但不会降到0(这种方式对我来说似乎更合乎逻辑):

for (unsigned i = size-1 ; i > 0 ; i--)
{
  // do stuff with i
}
Run Code Online (Sandbox Code Playgroud)

如果我说例如n=10,如果我print i在循环中,我会得到这个:

9
8
7
6
5
4
3
2
1
Run Code Online (Sandbox Code Playgroud)

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

for (unsigned i = size-1 ; i >= 0 ; i--)
{
  // do stuff with i
}
Run Code Online (Sandbox Code Playgroud)

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

Bat*_*eba 5

一个unsigned数字总是 > = 0.(当它达到零时,另一个减量将其设置为std::numeric_limits<unsigned>::max())

所以你的最终for循环相当于

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

当然,它永远循环.

在第一个循环中,您具有 i-- > 0停止条件.当i为零时,i--是一个值为零的表达式(因此循环停止),尽管i然后设置为std::numeric_limits<unsigned>::max().有些人喜欢(包括我;提示downvotes)写作i-->0-->视为幻灯片操作符.请参阅C++中的" - >"运算符是什么?