我正在尝试对向量运行循环,但不对最后两个元素运行循环。因此,我使用了以下实现:
vector<int> x;
for(int i=0;i<x.size()-2;i++){
cout<<"looping over element"<<endl;
}
然而,在x中不插入任何元素的情况下运行上述代码会导致无限循环。Ideone链接:
为什么我会有这种行为?如果x.size()==0
,则i<-2
条件不应保持,并且代码永远不应进入循环
x.size()
返回一个无符号值。如果这小于2
,则该值将下溢,并且结果将变得非常大。
另一方面,由于i
是一个有符号类型,因此它迟早会达到int
的最大值(仍将小于x.size() - 2
的结果(,然后i++
将导致算术溢出,这是未定义的行为。
在尝试此循环之前,必须确保x.size() >= 2
、和需要确保计数器变量是无符号类型(如size_t
(:
if (x.size() >= 2)
{
for (size_t i = 0; i < x.size() - 2; ++i)
{
// ...
}
}
当x.size((小于2,减去2,得到一些大值,因为结果是无符号的,((someunsigned(-1(是一个巨大的数字因此循环运行:
i=0
i=50000
i=1000000
i=4,294,967,295 //Stop
所以,你没有无限循环,只有一个运行很长的循环