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.
完全难过,请帮忙!
答案 0 :(得分:6)
<<
运算符未定义为C ++中的序列点,因此可以按任何顺序对ASCI1
和ASCI1++
进行求值。
如果您尝试对具有无序评估的对象执行读取和写入操作,那么您将具有未定义的行为,因此您将看到垃圾输出。
最后,你没有在最后看到换行符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循环的第一次迭代(当ASCI1
为1
时):
cout << ASCI1 << endl << ASCI1++;
此语句转换为(假设):
cout.print(ASCI1).printNewLine().print(ASCI1++);
正如其他人评论的那样,评估顺序没有定义。在您的情况下,首先执行++
操作,但最后一个print
语句要传递变量的旧值(即1
),而不是递增的值。 刚递增的值将传递给第一个print
。因此它变成了:
cout.print(2).printNewLine().print(1);
此声明后ASCI1
的值为1
。它将输出为:
2\n
1
下一次迭代将按照我上面解释的方式打印3
和2
2
13
2\n
你很幸运,你在一个声明中只使用了一个++
语句。
如果第一个print
通过1
而第二个通过2
,或1
和1
,该怎么办?这取决于编译器和编译阶段。这是未定义的行为( UB )