Auswerten von Argumenten in der std::cout-Einfügungsreihenfolge
In C die Reihenfolge der Argumentauswertung in Ausdrücken unter Verwendung der std::cout-Einfügung Operator kann verwirrend sein. Betrachten Sie den folgenden Codeausschnitt:
#include <iostream> bool foo(double &m) { m = 1.0; return true; } int main() { double test = 0.0; std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << foo(test) << "\tValue of test : " << test << std::endl; return 0; }
Die Ausgabe dieses Codes ist überraschend:
Value of test is : 1 Return value of function is : 1 Value of test : 0
Um diese Ausgabe zu verstehen, müssen Sie sich mit der Reihenfolge der Argumentauswertung befassen.
Unspezifische Auswertungsreihenfolge
Normalerweise gibt C die Auswertungsreihenfolge der Argumente in nicht an ein Ausdruck. Die Entscheidung liegt beim Compiler. Es gibt jedoch einige Ausnahmen, wie zum Beispiel:
Annahme einer Bewertung von links nach rechts
Es ist üblich, von einer Bewertung von links nach rechts auszugehen für std::cout-Einfügungen, dies ist jedoch nicht garantiert. In unserem Beispiel wird der „beschattete“ Test im dritten Argument vor dem Aufruf von foo ausgewertet, wodurch er geändert wird.
Auflösen der Verwirrung
Um das Beabsichtigte sicherzustellen Teilen Sie den Ausdruck in der Auswertungsreihenfolge in separate Anweisungen auf:
double test = 0.0; std::cout << "Value of test is : \t" << test << std::endl; std::cout << "Return value of function is : " << foo(test) << std::endl; std::cout << "Value of test : " << test << std::endl;
Dieser Code gibt korrekt Folgendes aus:
Value of test is : 0 Return value of function is : 1 Value of test : 1
Das obige ist der detaillierte Inhalt vonWarum ist die Argumentauswertungsreihenfolge std::cout in C unvorhersehbar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!