while(cin << zmienna) Co to ma być?

0

Ostatnio się zastanawiałem nad takim programem.

#include <iostream>

using namespace std;

int main()
{
    int zmienna=0;
    while(cin >> zmienna)
    {
        cout << zmienna+5 << endl;
    }
    return 0;
}

W while generalnie wstawia się wyrażenie warunkowe i jeżeli to wyrażenie warunkowe ma wartość true to pętla się wykonuje, a jak wyrażenie ma wartość false to pętla się nie wykonuje. No a tutaj mamy cin'a w wyrażeniu warunkowym pętli while. Jak C++ takie coś interpretuje? Bo nie za bardzo to ogarniam.

0

To wyrażenie jest prawdziwe jak wprowadzisz inta.

9

std::cin jest obiektem klasy std::basic_istream. Klasa ta ma przeciążony operator >>, który zwraca std::basic_istream &, czyli referencję do strumienia, z którego wczytujemy. W kontekście while() oczekiwane jest wyrażenie typu bool. Oznacza to, że trzeba skonwertować std::basic_istream & do typu bool. Da się tak, ponieważ klasa ta ma też przeciążony operator bool, który zwraca stan strumienia (zwraca dokładnie to samo co !std::cin.fail()).

Ciekawostka: przed C++11 nie mógł to być operator bool, bo np. operatora tego można także użyć w kontekście operacji arytmetycznych czy ogólne porównać dwa obiekty, które nie mają ze sobą niczego wspólnego. Aby to obejść używano operatora void *, który zwracał NULL, jeżeli w strumieniu ustawione były flagi błędów. To rozwiązanie oczywiście też nie jest idealne. Lepszym rozwiązaniem jest safe bool idiom, ale to coś, co trzeba napisać dodatkowo. W C++11 dodano możliwość określania operatorów słowem explicit tzn. że zostaną one użyte tylko podczas jawnych konwersji oraz podczas konwersji w konkretnych kontekstach - np. w while. (Ta zmiana powoduje też, że wspomniany idiom jest już niepotrzebny)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.