在我今天大学的演讲中,我们得到了这样的东西:
输入:1、2、3、0、4
和两个不同的代码
(1)
int x = 0;
int sum = 0;
int count = 0;
while (cin >> x && x != 0) {
sum += x;
count++;
}
cout << static_cast<double>(sum) / count;
(2)
int x = 1;
int sum = 0;
int count = 0;
while (x != 0 && cin >> x ) {
sum += x;
count++;
}
cout << static_cast<double>(sum) / count;
我知道第一个代码以输出2结尾,但显然第二个输出以1.5(6/4)输出结束。我的困惑在于,如果在输入零后循环变为假,为什么计数为4-这是条件中cin的位置,即初始化的x吗?我很困惑。谢谢!
答案 0 :(得分:4)
达到零时会发生什么?
while (cin >> x && x != 0)
您读入零,发现x为0。您将停止迭代。
while (x != 0 && cin >> x)
现在x
设置为零,但是您已经检查了x
的上一个值,但尚未为零。因此,您将再次进入循环:
sum += 0; // the current value of x
count++; // one summand more
,并且在随后的 循环运行中检查循环条件时,只会发现x
为零。
换句话说,在第二个变体中,您将零算作额外的求和。
答案 1 :(得分:1)
在第二种情况下,使用x == 0
输入循环 。 在sum
加0并递增count
后停止。
答案 2 :(得分:0)
在第一个循环中,不对值0进行计数。在第二个循环中,变量count中的值是0。
while (x != 0 && cin >> x ) { // <== 0 is read
sum += x;
count++; // <-- and count is increased
}
事实上,在第一个循环中,条件x != 0
是先决条件,而在第二个循环中,条件是后置条件。>
可以等效地重写第二个循环(假设输入成功)
do
{
cin >> x;
sum += x;
count++;
} while ( x != 0 );