Heim >Backend-Entwicklung >C++ >Warum ist die Reihenfolge der Argumentauswertung in „std::cout' nicht angegeben und wie kann ich eine konsistente Ausgabe sicherstellen?

Warum ist die Reihenfolge der Argumentauswertung in „std::cout' nicht angegeben und wie kann ich eine konsistente Ausgabe sicherstellen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-18 20:13:14224Durchsuche

Why is the Order of Argument Evaluation in `std::cout` Unspecified, and How Can I Ensure Consistent Output?

Reihenfolge der Argumentauswertung in std::cout

In C die Reihenfolge der Argumentauswertung im Stream-Einfügungsoperator (std::cout) ist nicht spezifiziert. Dies kann zu unerwartetem Verhalten führen, wenn mehrere Argumente gleichzeitig eingefügt werden.

Bedenken Sie den folgenden Code:

#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 erwartete Ausgabe dieses Codes ist:

Value of test is :    1    Return value of function is : 1    Value of test : 1

Die tatsächliche Ausgabe kann jedoch je nach Compiler und Plattform variieren. Der Code könnte Folgendes ausgeben:

Value of test is :      1       Return value of function is : 1 Value of test : 0

Dies liegt daran, dass die Auswertungsreihenfolge der Argumente in der std::cout-Anweisung nicht definiert ist. Im ersten Fall wird test vor dem Aufruf von foo() ausgewertet, sodass 1 ausgegeben wird. Im zweiten Fall wird test nach dem Aufruf von foo() ausgewertet, sodass 0 ausgegeben wird.

Um die richtige Reihenfolge sicherzustellen , teilen Sie den Ausdruck in mehrere Anweisungen auf:

double test_after_foo = foo(test);
std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << test_after_foo << "\tValue of test : " << test_after_foo << std::endl;

Dies garantiert, dass foo(test) vor der std::cout-Anweisung ausgewertet wird, wodurch eine konsistente Ausgabe über verschiedene Compiler hinweg bereitgestellt wird Plattformen.

Das obige ist der detaillierte Inhalt vonWarum ist die Reihenfolge der Argumentauswertung in „std::cout' nicht angegeben und wie kann ich eine konsistente Ausgabe sicherstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn