2016-04-14 5 views
5

Myślałem, że:W jaki sposób cin ocenia się jako prawdziwe, gdy znajduje się wewnątrz instrukcji if?

if (true) 
{execute this statement} 

Więc w jaki sposób if (std::cin >> X) wykonać jak wtedy, kiedy nie ma nic „true” na ten temat? Mogłem zrozumieć, czy było to if (x <= y) lub if (y [operator] x), ale jaka jest logika "istream = true?".

+1

jeśli "przyjmie" wartość bool. dlatego wszystko wewnątrz funkcji() zostanie rzucone do bool poprzez operator bool(); także, zobacz http://stackoverflow.com/questions/6791520/if-cin-x-why-can-you-use-thond-condition – Exceptyon

+3

Strumień jest "true-ish", jeśli ostatnia operacja zakończyła się powodzeniem. – molbdnilo

+4

Pierwsze pytanie, które należy zadać sobie, to jaka jest wartość wyrażenia '(std :: cin >> X)'. –

Odpowiedz

9

Odpowiedź zależy od wersji standardowej C++ Library:

  • Przed C++ 11 konwersja wewnątrz if oparła się na konwersję strumienia do void* wykorzystaniem operator void*
  • Począwszy C++ 11 konwersja polega na operator bool z std::istream

Zauważ, że std::cin >> X jest nie tylko stwierdzenie, ale także wyrazem. Zwraca ona std::cin. Takie zachowanie jest wymagane w przypadku "połączonego" wejścia, np. std::cin >> X >> Y >> Z. Takie samo zachowanie przydaje się podczas wprowadzania danych do wnętrza if: wynikowy strumień jest przekazywany do operator bool lub operator void*, więc wartość boolowska jest podawana do warunku.

3

if(x) jest równoważna if(bool(x))

w tym przypadku bool(x) nazywa std::istream::operator bool(x)

to powróci:

prawdziwe, jeśli żaden z failbit lub badbit jest ustawiony.

Fałszywe inaczej.

3

Co jest w stanie if stan zostanie oceniony na bool.

if(cin >> X) oznacza, że ​​jeśli stan to true, coś zostało odczytane na X; jeśli stan to false, wydarzyło się coś innego (np. zakończył się strumień) i X nie został zmieniony.

E.g. aby czytać do końca strumienia, możesz użyć while(cin >> X).