Recently in an interview there was a following objective type question.
int a = 0;
cout << a++ << a;
Answers:
a. 10
b. 01
c. undefined behavior
I answered choice b, i.e. output would be "01".
But to my surprise later I was told by an interviewer that the correct answer is option c: undefined.
Now, I do know the concept of sequence points in C++. The behavior is undefined for the following statement:
int i = 0;
i += i++ + i++;
but as per my understanding for the statement cout << a++ << a
, the ostream.operator<<()
would be called twice, first with ostream.operator<<(a++)
and later ostream.operator<<(a)
.
I also checked the result on VS2010 compiler and its output is also '01'.
You can think of:
As:
C++ guarantees that all side effects of previous evaluations will have been performed at sequence points. There are no sequence points in between function arguments evaluation which means that argument
a
can be evaluated before argumentstd::operator<<(std::cout, a++)
or after. So the result of the above is undefined.C++17 update
In C++17 the rules have been updated. In particular:
Which means that it requires the code to produce result
b
, which outputs01
.See P0145R3 Refining Expression Evaluation Order for Idiomatic C++ for more details.