我是 C++ 的新手,我正在尝试实现一个向后的 for 循环,我找到了非常有效的解决方案,但我想知道我的版本不正确并导致无限循环。
这是我创建的一个工作版本(我不明白我们如何减少条件中的 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
}
有人可以向我解释为什么最后一个版本不起作用以及最佳选择是什么吗?
最佳答案
安unsigned
number 总是>= 0。(当它达到零时,进一步的减量将其设置为 std::numeric_limits<unsigned>::max()
)
所以你的最终for
循环等同于
for (unsigned i = size-1 ; true ; i--)
当然,它会永远循环。
在你的第一个循环中,你有 i-- > 0
作为停止条件。当i
为零,i--
是一个值为零的表达式(因此循环停止),尽管i
然后设置为 std::numeric_limits<unsigned>::max()
.有些人喜欢(包括我;暗示反对票)写 i-->0
并考虑-->
作为幻灯片运算符(operator)。参见 What is the "-->" operator in C++?
关于c++ - 难以理解的无限后向循环C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37610220/