对于C++中的循环函数参数奇性

Mar*_*ler 1 c++

在我目前的项目中,我偶然发现了一个奇怪的现象,即嵌套的for循环只执行一次内循环然后停止.即使仔细检查了所涉及的所有变量,外部for循环仍然没有正当理由终止.使这个结构与我程序中包含的其他for循环不同的唯一因素是,计数器变量作为参数传递给包含循环的函数,并且从不复制到任何地方.

所以我决定测试是否可以重现问题:

#include <stdio.h>

void someFunction(int x, int y, int width, int length)
{
    int endX = x+width;
    int endY = y+length;

    printf("x will not exceed: %i\n", endX);
    printf("y will not exceed: %i\n", endY);

    for(; x < endX; x++)
    {
        for(; y < endY; y++)
        {
            printf("(%i, %i)\n", x, y);
        }
    }
}

int main(int argc, const char *argv[])
{
    someFunction(1, 1, 5, 5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,在执行时,应用程序的输出与直观的预期不同:

x will not exceed: 6
y will not exceed: 6
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(1, 5)
Run Code Online (Sandbox Code Playgroud)

切换x和y时行为类似,但y变量永远不会递增.通过简单地将新变量声明为每个循环的计数器来解决该问题.

但为什么会这样呢?是否因特定原因而被禁止?编译器是否禁用某些参数的修改,如果是,为什么它适用于一个变量但不适用于另一个变量?

提供的源代码是使用GCC/G ++ 4.5.3编译的,没有任何特殊的优化标志.

Mar*_*som 13

y永远不会在x循环中重置,所以一旦它超出第一遍的范围,它将永远超出界限.