【问题标题】:vector.size() - 2 leads to infinite loop - C++ [duplicate]vector.size() - 2 导致无限循环 - C++ [重复]
【发布时间】:2021-01-09 16:32:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否真的尝试打印x.size()-2 是什么?您会惊讶地发现结果不是 -2。

标签: c++ vector c++14


【解决方案1】:

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

另一方面,由于i 是一个有符号 类型,它迟早会达到int 的最大值(仍然小于@987654325 的结果) @),然后i++ 将导致算术溢出,这是未定义的行为

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

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

}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-20
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多