代码之家  ›  专栏  ›  技术社区  ›  Bula

为什么执行以下循环

c++
  •  -6
  • Bula  · 技术社区  · 8 年前
    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 回复  |  直到 8 年前
        1
  •  9
  •   Ron Alan    8 年前

    自从 tmp.size() 1 ,从中减去3产生负值。也就是说,如果不是因为 tmp。大小() 存在 size_t ,未签名。

    当一个无符号的减法即将变为负数时,它会“环绕”到一个非常大的值。这就是循环无法停止的原因。它还解释了编译器产生的“有符号到无符号比较”警告 * ,这应该让你保持高度警惕。

    要避免此问题,请将减法移到另一侧,并将其设为加法:

    for (size_t i = 0 ; i+3 <= tmp.size() ; i += 2) {
        ...
    }
    

    * 如果没有收到该警告,请更改编译器上的设置,以警告您一切。这节省了调试编译器很容易检测到的许多常见问题所花费的大量时间。

        2
  •  2
  •   llllllllll    8 年前

    因为你的 tmp.size() 仅为1,在 for 回路:

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

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