对while(cin >> x && x!= 0)(当int x = 0)和while(x!= 0 && cin >> x)(int x = 1)感到困惑

时间:2019-09-26 14:57:19

标签: c++ loops while-loop do-while

在我今天大学的演讲中,我们得到了这样的东西:

输入: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吗?我很困惑。谢谢!

3 个答案:

答案 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 );