在向量中使用for循环时是否存在错误?

Pau*_*ina 1 c++ loops vector unsigned-integer integer-arithmetic

问题是当我执行“ for(int i = 0; i <vector.size()-1; i ++)”时,它给我一个“向量下标超出范围”的错误。但是,如果我将vector.size()-1放入变量中,它将起作用。这是小故障还是我只是想念一些东西?

这有效:

    int sizePos = positionsX.size() - 1;

    for (int i = 0; i < sizePos; i++) {
        if (snake.getX() == positionsX[i] && snake.getY() == positionsY[i]) {
            gameOver = true;
            std::cout << as << std::endl;
            as++;
        }

        if (apple.getX() == positionsX[i] && apple.getY() == positionsY[i]) {
            apple.eat();
        }
    }
Run Code Online (Sandbox Code Playgroud)

并且这不会:

    for (int i = 0; i < positionsX.size() - 1; i++) {
        if (snake.getX() == positionsX[i] && snake.getY() == positionsY[i]) {
            gameOver = true;
            std::cout << as << std::endl;
            as++;
        }

        if (apple.getX() == positionsX[i] && apple.getY() == positionsY[i]) {
            apple.eat();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 7

positionsX.size()是一种unsigned。如果它为零,则由于折回以及表达式以无符号算术求值的事实,因此将其减去1将得到无符号类型的最大值!

使用

for (std::size_t i = 0; i + 1 < positionsX.size(); i++) {
Run Code Online (Sandbox Code Playgroud)

取而代之的是,没有什么可以总是忽略向量中的最后一个元素。如果您不想要,请删除+ 1