最近のインタビューで、次の客観的なタイプの質問がありました。
int a = 0;
cout << a++ << a;
答え:
a。10
b。01
c。未定義の動作
選択肢bに答えました。つまり、出力は「01」になります。
しかし、驚いたことに、インタビュアーから正しい答えはオプションc:未定義であると言われました。
今、私はC ++のシーケンスポイントの概念を知っています。次のステートメントの動作は未定義です。
int i = 0;
i += i++ + i++;
しかし、文の私の理解あたりとしてcout << a++ << a
、ostream.operator<<()
最初で、二回呼び出されますostream.operator<<(a++)
以降ostream.operator<<(a)
。
VS2010コンパイラで結果を確認したところ、その出力も「01」です。
10
、それはどちらかだろう01
か00
。(c++
常に値と評価されますc
持っていた前に、インクリメントされます)。そして、それが未定義ではなかったとしても、それは恐ろしく混乱させるでしょう。