2017-02-04 14 views
0

Я написал простой код:C++: CIN внутри время цикла

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a, b; 
    while (cin >> a >> b)  //Note the cin inside while loop 
    { 
    cout << a << b << "\n"; 
    } 
} 

Мы знаем, что только while функции цикла, когда выражение true (1) или false (0). cin Оценка true и false.

Также как работает цикл, когда я ввожу число и останавливается, когда я ввожу что-то не цифру? Как он оценивает истину и ложь?

ответ

1

Когда пишет cin >> a, вы на самом деле с помощью std::istream::operator>>, по ссылке here, этот оператор возвращает ссылку на объект istream& и взял переменную правой руки (ссылка) в качестве аргумента. Вот как вы можете связать его так: cin >> a >> b.

Чтобы увидеть это cin >> a >> b цепь другой путь, когда ломаются, то это два шага:

  • Первый шаг, cin >> a возвращает некоторое промежуточное значение, скажем, это x. (Вы действительно можете попробовать auto x = cin >> a.
  • Второй шаг, вы делаете (cin >> a) >> b, когда мы используем это промежуточное значение x, мы могли бы написать это как x >> b.

Так что, черт возьми, это x? x здесь остается такая же позиция как cin, он является объектом istream& типа.

Поэтому, когда вы говорите о true или false, вы на самом деле говорить об этом вернулось ли istream& ссылки, обратитесь к объект, будь то true или false. Это будет false, когда стандартный вывод поймает знак EOF (например, когда вы набираете Ctrl-C в unix-подобной системе или когда вы читаете до конца файла).

Ваш код, таким образом, может быть расширен

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a, b; 
    auto x = cin >> a >> b 
    while (x) 
    { 
    cout << a << b << "\n"; 
    } 
} 

Если вы используете IDE, как Visual Studio, вы можете наведите курсор мыши на переменную x, она предложит вам тип x «s, и это будет istream&.

Кроме того, благодаря Bob__, этот istream& класс может быть преобразовать в ios::operator bool класс, как написано here, будь то true или false представляет состояние (ios_base::iostate) этого stream, он Therfore,

позволяет использовать потоки и функции, которые возвращают ссылки на потоки как условия цикла, приводящие к идиоматическим входным контурам C++, таким как while(stream >> value) {...} или while(getline(stream, string)){...}. Такие циклы выполняют тело цикла только в том случае, если операция ввода выполнена успешно.

Для дальнейшего понимания, вы должны прочитать главу оператора (перегрузка) в учебнике.

+1

Возможно, вам стоит упомянуть [operator bool] (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool). –

+0

@Chazeon: Обновленный ответ действительно объяснительный. Благодарю. :) – aps120797