为什么以下循环执行

Bul*_*ula -6 c++

std::vector<int> tmp = ...
for(int i = 0; i <= tmp.size() - 3; i+=2){
    std::cout << "i: " << i << " , tmp.size(): " << tmp.size() << std::endl;
    if(tmp[i] == tmp[i+1]){
        final.push_back(tmp[i] * 2);
    }else{
        final.push_back(tmp[i]);
        final.push_back(tmp[i + 1]);
    }   
    std::cout << "\ntmp.size() at the end of loop: " << tmp.size() << "\n";         
}
Run Code Online (Sandbox Code Playgroud)

我有以下输出:

在此输入图像描述

为什么循环执行i明显要大得多tmp.size()

das*_*ght 9

因为tmp.size()1,从中减去3会产生负值.也就是说,减法会产生负值,如果它不是tmp.size()存在的size_t,那么它是无符号的.

当无符号在减法时即将变为负数时,它会"包裹"到一个非常大的值.这就是你的循环无法停止的原因.它还解释了编译器*产生的"签名到无符号比较"警告,它应该让你处于高度警戒状态.

要避免此问题,请将减法移至另一侧,并将其添加:

for (size_t i = 0 ; i+3 <= tmp.size() ; i += 2) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

*如果您没有收到该警告,请更改编译器上的设置以警告您所有内容.这节省了大量时间用于调试编译器可以轻松检测到的许多常见问题.