Home >Backend Development >C++ >Is `cout
Unveiling the Enigma of "cout << a << a": Undefined Behavior or a Predestined 01?
In a recent interview, an enigmatic coding conundrum surfaced:
int a = 0; cout << a++ << a;
With tempting options to choose from, including 10, 01, and the mysterious "undefined behavior," the interviewee confidently selected 01, citing their understanding of sequence points. However, the interviewer's response was met with astonishment: the correct answer was, surprisingly, undefined.
Exploring Undefined Territory
Sequence points typically guarantee the completion of side effects before moving onto subsequent evaluations. Intriguingly, the statement in question does not possess any sequence points between the argument evaluations. This means that the argument "a" could be computed before or after the argument "cout << a ." This ambiguity renders the result unpredictable, hence the deeming of undefined behavior.
A Ray of Hope in C 17
The coding landscape has been transformed in C 17, where the rules governing expression evaluation have been revised. The latest guidelines explicitly stipulate that in shift operator expressions, all computations and side effects of the first argument ("E1") are sequenced before those of the second argument ("E2").
This crucial adjustment mandates the code snippet in question to output 01. The elusive undefined behavior has been dispelled, replaced by the certainty of a predetermined outcome.
A Deeper Dive into the Embers of P0145R3
For those seeking a more comprehensive understanding, the technical paper P0145R3: Refining Expression Evaluation Order for Idiomatic C delves into the intricate details of the revised expression evaluation order, providing a profound insight into the evolution of the C coding paradigm.
The above is the detailed content of Is `cout. For more information, please follow other related articles on the PHP Chinese website!