我是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
}
有人可以向我解释为什么最后一个版本不起作用,最佳选择是什么?
答案 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
始终为真,因为i
为unsigned
,这意味着永远不会低于零。如果在i
为零时减小该值,则会出现所谓的下溢,并且它将具有非常高的数字。
第一个版本肯定能完成工作,所以我会坚持下去。