Путать в то время как (cin >> x && x! = 0) (когда int x = 0) против while (x! = 0 && cin >> x) (когда int x = 1) - PullRequest
0 голосов
/ 26 сентября 2019

В лекции моего университета сегодня нам дали следующее:

вход: 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 ]

4 голосов
/ 26 сентября 2019

Что происходит, когда вы достигаете нуля?

while (cin >> x && x != 0)

Вы читаете в нуле и обнаруживаете, что х равен 0. Вы прекратите итерацию.

while (x != 0 && cin >> x)

Теперь xустановлен на ноль, но вы проверили предыдущее значение x, которое еще не было равно нулю , затем .Таким образом, вы снова войдете в цикл:

sum += 0; // the current value of x
count++;  // one summand more

и обнаружите, что x получил ноль при проверке состояния цикла при последующем запуске цикла.

Inдругими словами, во втором варианте вы считаете ноль дополнительным слагаемым.

1 голос
/ 26 сентября 2019

Во втором случае цикл вводится с x == 0.Он останавливается после , добавляя 0 к sum и увеличивая count.

0 голосов
/ 26 сентября 2019

В первом цикле значение 0 не учитывается.В то время как во втором цикле значение 0 подсчитывается в переменной count.

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 );
...