为什么以下循环执行

时间:2018-02-08 18:27:39

标签: 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";         
}

我有以下输出:

enter image description here

为什么循环执行i显然比tmp.size()大得多?

2 个答案:

答案 0 :(得分:9)

由于tmp.size()1,从中减去3会产生负值。也就是说,如果tmp.size()不是size_t,那么减法会产生负值,而for (size_t i = 0 ; i+3 <= tmp.size() ; i += 2) { ... } 是无符号的。{/ p>

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

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

stickyTracking: false,

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

答案 1 :(得分:2)

因为tmp.size()循环中for仅为1,所以

for(int i = 0; i <= tmp.size() - 3; i+=2) { /* ... */ }

tmp.size() - 3变为负数,但是使用无符号类型,因此数字很大。这就是为什么你的i不会停止增加,即使它非常大。