在我当前的项目中,我偶然发现了一个奇怪的现象,即嵌套的 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;
}
然而,在执行时,应用程序的输出与直观的预期不同:
x will not exceed: 6
y will not exceed: 6
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(1, 5)
切换 x 和 y 时的行为类似,但 y 变量从不递增。这个问题通过简单地声明一个新变量作为每个循环的计数器来解决。
但是为什么会这样呢?是否因特定原因而被禁止?编译器是否禁用对某些参数的修改,如果是,为什么它对一个变量起作用,而对另一个变量不起作用?
提供的源代码是用 GCC/G++ 4.5.3 编译的,没有任何特殊的优化标志。