为什么这个循环运行不可见的代码?并没有按顺序工作

时间:2016-06-08 18:40:12

标签: c++

int ASCI1 = 1;

for (int i = 1; i < 8; i++)
{
    cout << ASCI1 << endl << ASCI1++;
}

我得到输出:

2
13
24
35
46
57
68

7(由于某种原因,这里没有终点线)。

想法是

1
2
3
4 
etc.

完全难过,请帮忙!

4 个答案:

答案 0 :(得分:6)

<<运算符未定义为C ++中的序列点,因此可以按任何顺序对ASCI1ASCI1++进行求值。

如果您尝试对具有无序评估的对象执行读取和写入操作,那么您将具有未定义的行为,因此您将看到垃圾输出。

最后,你没有在最后看到换行符1)因为你很幸运,2)因为即使你的循环按照你的计划执行,你仍然在执行写操作而不跟随另一个{ {1}}

答案 1 :(得分:2)

代码不可见。每个循环执行时输出两个数字,一个在第一行,然后是一个换行,然后是另一个在下一行。

只做

int ASCI1 = 1;
for (int i = 1; i <= 4; i++){
    cout << ASCI1++ << endl;
}

答案 2 :(得分:1)

不清楚为什么你造成这个混乱,只需使用:

int ASCI1 = 1;

for (int i = 0; i < 4; i++) {
    cout << ASCI1++ << endl;
}

请注意,您应该从0开始(如图所示)或将条件更改为<=,否则您将循环3次而不是4次。

答案 3 :(得分:0)

让我们考虑for循环的第一次迭代(当ASCI11时):

cout << ASCI1 << endl << ASCI1++;

此语句转换为(假设):

cout.print(ASCI1).printNewLine().print(ASCI1++);

正如其他人评论的那样,评估顺序没有定义。在您的情况下,首先执行++操作,但最后一个print语句要传递变量的旧值(即1),而不是递增的值。 刚递增的值将传递给第一个print。因此它变成了:

   cout.print(2).printNewLine().print(1); 

此声明后ASCI1的值为1。它将输出为:

2\n
1

下一次迭代将按照我上面解释的方式打印32

2
13
2\n

你很幸运,你在一个声明中只使用了一个++语句。

如果第一个print通过1而第二个通过2,或11,该怎么办?这取决于编译器和编译阶段。这是未定义的行为 UB