Хотя цикл не может завершиться, когда ему передано ложное условие - PullRequest
2 голосов
/ 09 июня 2019

Рассмотрим следующий код для вычисления суммы чисел, введенных пользователем во время выполнения:

#include <iostream>
using namespace std;

int main()
{
    int sum = 0;         //stores sum of numbers
    int taken;           //stores the number inputted by the user
    while(cin>>taken)    
    {
         sum += taken;
    }

    cout<<"The sum is : "<<sum;
    return 0;
}

Теперь я ожидаю, что цикл завершится сам по себе и отобразит сумму чисел, введенных пользователемкак только пользователь вводит 0, потому что while(0) оценивается как ложное, в результате чего цикл завершается, и, следовательно, должна выполняться сумма чисел печати оператора.

Но этого не происходит.

Итак, почему цикл while не завершается, когда пользователь вводит 0 в качестве ввода?


Пожалуйста, рассмотрите мой пример запуска программы ниже:

  • 3
  • 2
  • 1
  • 0
  • 5

(Затем, наконец, нажмите ctrl-z, чтобы указать конец-file)

Сумма: 11


Вот мои сомнения в приведенном выше примере:

После того, как я ввел 0, мне не нужно запрашиватьдальнейшие входные данные, потому что, по моему мнению, while(0) должно оцениваться как ложное, и, следовательно, утверждение, говорящеесумма чисел, введенных до 0, должна быть напечатана на экране, чего не происходит.

Ответы [ 2 ]

4 голосов
/ 09 июня 2019

Значение cin>>taken не является значением taken. Это твое недоразумение.

Вы можете написать этот код

while (cin >> taken && taken != 0)
{
    ...
}

, который будет делать то, что вы хотите.

В качестве дополнительного примечания значение cin >> taken отражает состояние потока . Обычно в логическом контексте поток оценивается как true, но если произошла какая-то ошибка, поток оценивается как false. Вот почему while (cin >> taken) фактически означает чтение до тех пор, пока не будет прочитано больше целых чисел.

2 голосов
/ 09 июня 2019

Итак, почему цикл while не завершается, когда пользователь вводит 0 в качестве ввода?

while (cin >> taken) оценивается не как while (taken), а как while (bool(cin)).После считывания в переменную cin будет приведен к bool, который проверяет наличие ошибок в потоке.

Из документов :

Возвращаемое значение

true, если в потоке нет ошибок, false в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...