# C++ Notes: What values do the I/O operators (<< and >>) return?

## What values do the I/O operators (<< and >>) return?

C++ allows you to define functions to associate with existing operators. The << and >> operators, whose orginal meanings were bitwise left and right shift, have additional meanings for C++ iostreams. So how do they work?

The >> and << operators are evaluated left-to-right, so the following are equivalent statements, altho writing the parentheses would be rather weird.

    cin >> a >> b >> c;
    (((cin >> a) >> b) >> c);  // Same as above.

What value is produced, for example, by `(cin >> a)`? And I mean what value is produced in the expression, not what value is read into the variable. It calls an overloaded templated function (`operator>>`) in an `istream` class which reads input and stores it into the variable on the right. It then returns the left operand (ie, `cin`) so the result can be used if there is another >> operator. This chaining of the I/O operators is a rather clever solution. Here's an example program that shows this.

        if ((cin >> a) == cin) {
            cout << "Equal" << endl;   // Yes, it is true
        } else {
            cout << "Not Equal" << endl;
        }

## Why `cin` can be used as a truth value

It's possible to make tests like

       if (cin)

which will be true if cin is ok and false if at an end-of-file or has encountered an error. It's type is `istream&` (input stream reference), so how can that be used as a truth value. The trick is that when it's evaluated in the context of a condition, eg, in an `if` or `while` statement, a special function is called in the `istream` class. This function returns a value that can be interpreted as true or false.

## Reading in the while condition

Because the >> operator returns the iostream (eg, `cin`), which can be tested for EOF or errors, the `cin loop` idiom can be used.

       while (cin >> x) { . . . }

which effectively tests for EOF, and also that the input is a valid value.

## See also

End-Of-File (EOF)