現在のプロジェクトで、入れ子になった for ループが内側のループを 1 回だけ実行してから停止するという奇妙な現象に出くわしました。関連するすべての変数を注意深く調べた後でも、外側の 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 でコンパイルされています。