Ich habe Schwierigkeiten, die Reihenfolge der Aufrufe im folgenden Code zu verstehen. Ich habe erwartet, die Ausgabe unter
zu sehen %Vor%Ich kann zwar sehen, dass die Ausgabe, die ich bekomme,
ist %Vor% Ich dachte, dass der Aufruf std::cout<< b->fooA() << b->fooB() << std::endl
dem Aufruf
aber ich kann sehen, dass dies nicht der Fall ist. Kannst du mir helfen, besser zu verstehen, wie das funktioniert und wie die Beziehung zum globalen operator<<
aussieht? Wird diese letzte jemals in dieser Reihenfolge aufgerufen?
Grüße
AFAG
%Vor% Der Compiler kann die Funktion printcbase()
wie folgt auswerten:
oder einige von vielen Permutationen von Linien, die mit 1 - 4 markiert sind. Es wird nur garantiert, dass die Linie 1 vor der Linie 3 und die Linie 2 vor der Linie 4 (und natürlich Linie 3 vor Linie 4) erfolgt. Standard sagt nicht mehr und in der Tat können Sie unterschiedliche Ergebnisse mit verschiedenen C ++ - Compilern erwarten.
Die Reihenfolge der Ausführung von <<
ist gut definiert, aber die Reihenfolge der Auswertung von Unterausdrücken ist in C ++ nicht definiert. Dieser Artikel und das C-Codebeispiel veranschaulichen das von Ihnen erwähnte Problem.
BA12
und AB12
sind beide korrekt. Im folgenden Code:
1
wird vor 2
angezeigt, aber A
könnte vor oder nach B
erscheinen, da der Compiler nicht verspricht, zuerst fooA
oder fooB
auszuwerten.
Die Verschiebungsoperatoren sind linksassoziativ; a << b << c
wird als (a << b) << c
gelesen, was bedeutet, dass, wenn a
vom Typ benutzerdefiniert operator<<
ist (und diesen Typ zurückgibt), der Ausdruck als a.operator<<(b).operator<<(c)
gelesen wird. Wenn stattdessen ein freies operator<<
verwendet wird, wird dies als operator<<(operator<<(a, b), c)
gelesen.
So wird die Auswertung von a << b
vor der Auswertung von (a << b) << c
sequenziert, aber es gibt keine Sequenzabhängigkeit zwischen der Auswertung von b
und c
:
Wenn wir die Nebenwirkungen wie oben beschrieben nummerieren, können die Nebenwirkungen wie folgt sequenziert werden:
%Vor%Tags und Links c++ stream operator-keyword cout ostream