C ++嵌套有外部变量的循环

时间:2018-02-14 10:19:07

标签: c++ loops gcc

这绝对是一个愚蠢的问题,已经多次回答,但我真的很困惑,也无法找到如何谷歌。
我在软件开发方面有大约4年的经验,但那件事让我不知所措:

UNIX_TIMESTAMP()

结果是

int x1 = 2, x2 = 5;
int y1 = 2, y2 = 5;
for (; x1 <= x2; x1++) {
    for (; y1 <= y2; y1++) {
        cout << x1 << " : " << y1 << endl;
    }
}

但我期待看到:

2 : 2
2 : 3
2 : 4
2 : 5

我的意思是 x1 甚至没有更新过一次。

我认为这与外部范围和编译器优化有关。请澄清我。

5 个答案:

答案 0 :(得分:1)

您没有重置y1。

int x1 = 2, x2 = 5;
int y2 = 5;
for (; x1 <= x2; x1++) {
    for (y1 = 2; y1 <= y2; y1++) { // This resets y1 every time the loop starts
        cout << x1 << " : " << y1 << endl;
    }
}

或者

int x1 = 2, x2 = 5;
int y1 = 2, y2 = 5;
for (; x1 <= x2; x1++) {
    y1 = 2;
    for (; y1 <= y2; y1++) {
        cout << x1 << " : " << y1 << endl;
    }
}

答案 1 :(得分:0)

这就是你应该像下面这样对for循环进行编码以避免这种副作用的原因,这样你就不应该忘记在这种情况下重新初始化的计数器变量y1。同时声明并初始化计数器变量外侧for循环不会给你带来任何好处。所以总是尽量避免这种实现,并遵循以下方法:

int x2 = 5;
int y2 = 5;
for (int x1 = 2; x1 <= x2; x1++) {
    for (int y1 = 2; y1 <= y2; y1++) {
        cout << x1 << " : " << y1 << endl;
    }
}

答案 2 :(得分:0)

此行为是正确的。

在嵌套循环之后,你再也没有设置y1=2;,因此cout << x1 << ":" << y1 endl永远不会再次运行,因为当嵌套循环结束时y1为6,因此不符合条件(y1 <= y2 )在嵌套循环中给出。

编辑:有关正常工作的代码,请参阅user9335240

中的评论

答案 3 :(得分:0)

问题在于inner for-loop。 在第一次迭代时(当x12时),您将获得打印结果,即

2 : 2
2 : 3
2 : 4
2 : 5

因为,你没有重新初始化y2变量,因此,在内循环的所有后续迭代中,条件y1 <= y2被评估为false(此时y2在这种情况下是6)。因此,您没有按预期获得输出。

您可以按照修改后的代码进行确认:

int x1 = 2, x2 = 5;
int y1 = 2, y2 = 5;
for (; x1 <= x2; x1++) 
{
    for (; y1 <= y2; y1++) 
    {
        cout << x1 << " : " << y1 << endl;
    }
    cout<<"In outer loop with x1="<<x1<<" and y1="<<y1<<endl;
}

您将获得以下输出:

Point 1: In outer loop with x1=2 and y1=2
2 : 2
2 : 3
2 : 4
2 : 5
Point 2: In outer loop with x1=2 and y1=6
Point 1: In outer loop with x1=3 and y1=6
Point 2: In outer loop with x1=3 and y1=6
Point 1: In outer loop with x1=4 and y1=6
Point 2: In outer loop with x1=4 and y1=6
Point 1: In outer loop with x1=5 and y1=6
Point 2: In outer loop with x1=5 and y1=6

要获得预期的输出,请在内循环中将y1重新初始化为2。即将内循环从for (; y1 <= y2; y1++)更改为for (y1 = 2; y1 <= y2; y1++)

答案 4 :(得分:0)

你应该重置y1的值,它可以通过上述步骤完成,或者像这样:

int x1 = 2, x2 = 5;
int y2 = 5;
for (; x1 <= x2; x1++) {
for (; y1 <= y2; y1++) { // This resets y1 every time the loop  starts
    cout << x1 << " : " << y1 << endl;
}
y1 = 2;
}