C における左から右への印刷の謎を明らかにする
次の C コードの動作は不可解です:
myQueue.enqueue('a'); myQueue.enqueue('b'); cout << myQueue.dequeue() << myQueue.dequeue();
驚くべきことに、予想される代わりに「ba」がコンソールに出力されます。 「アブ」。なぜこのようなことが起こるのでしょうか?
この謎を解明するには、オーバーロードされた << の性質を理解する必要があります。オペレーター。 C では、 <
<< への引数の評価順序。 C 標準では保証されていません。これは、コンパイラーが引数を任意の順序で自由に評価できることを意味します。これには、順序を外して評価する可能性も含まれます。
この例では、コードは次の形式の式にコンパイルされます。
cout << ( (myQueue.dequeue()) << (myQueue.dequeue()) );
コンパイラは、各デキュー呼び出しと再帰呼び出しの結果の前後にかっこを挿入します。 2 番目のデキュー呼び出しの結果は、最初のデキュー呼び出しを囲む括弧内に挿入されます。
動作を理解するための鍵は、<< の引数を理解することです。演算子は右から左の順序で評価されます。したがって、次は上記のコードと同等です:
( (myQueue.dequeue()) << (myQueue.dequeue()) ) << cout;
この順序では、2 番目のデキュー呼び出しが最初に評価され、結果は 'b' になります。この呼び出しの結果は << に渡されます。 cout への参照を返す演算子。その後、最初のデキュー呼び出しが評価され、結果として「a」が得られ、これは前の << によって返された参照に渡されます。 Operator.
これは、コードが「ab」ではなく「ba」を出力する理由を説明しています。 <<演算子は最初に 'b' を出力し、次に 'a' を出力します。
一貫した左から右への出力を保証するには、次のように括弧を使用して評価順序を明示的に制御する必要があります。
cout << (myQueue.dequeue()) << ' ' << (myQueue.dequeue());
以上がこの C コードでは「ab」ではなく「ba」が出力されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。