vector.size() - 2 导致无限循环 - C++

vector.size() - 2 leads to infinite loop - C++

我正在尝试 运行 向量上的循环,而不是最后两个元素上的循环。因此,为此我使用了以下实现:

vector<int> x;
for(int i=0;i<x.size()-2;i++){
    cout<<"looping over element"<<endl;
}

但是,运行在没有向 x 中插入任何元素的情况下执行上述代码会导致无限循环。 爱德华 link:

为什么我会出现这种行为?如果 x.size()==0 那么 i<-2 条件不应该成立,代码永远不会进入 for 循环

当x.size()小于2,你减去2,你会得到一个很大的值,因为结果是无符号的,而且((someunsigned)-1)是一个巨大的数字 所以循环运行:

i=0
i=50000
i=1000000
i=4,294,967,295 //Stop

所以,你没有无限循环,只有很长的运行循环

x.size() returns 一个无符号值。如果小于 2 则该值将下溢,结果将变得非常大。

另一方面,由于 isigned 类型母鸡,它迟早会达到 int 的最大值(这将仍然小于 x.size() - 2) 的结果,然后 i++ 将导致算术溢出,即 未定义行为.

在尝试此循环之前,您必须确保 x.size() >= 2 您需要确保计数器变量是无符号类型(如 size_t):

if (x.size() >= 2)
{
    for (size_t i = 0; i < x.size() - 2; ++i)
    {
        // ...
    }

}