Heim >Backend-Entwicklung >C++ >Wie wirkt sich die Reihenfolge der Argumentauswertung auf die Ausgabe von „std::cout' in C aus?

Wie wirkt sich die Reihenfolge der Argumentauswertung auf die Ausgabe von „std::cout' in C aus?

Susan Sarandon
Susan SarandonOriginal
2025-01-01 10:45:111058Durchsuche

How Does Argument Evaluation Order Affect `std::cout` Output in C  ?

Reihenfolge der Auswertung in std::cout-Argumenten

Vor allem die Reihenfolge der Auswertung der an std::cout übergebenen Argumente kann verwirrend sein wenn ein oder mehrere Argumente ein Funktionsaufruf sind, der den Wert eines anderen Arguments ändert.

Code Beispiel

Betrachten Sie das folgende C-Code-Snippet:

#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;
}

Unerwartete Ausgabe

Bei der Ausführung erzeugt dieser Code die folgende Ausgabe:

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

Diese Ausgabe mag überraschend erscheinen, da man erwarten könnte, dass der Wert von test nach dem foo 1 ist Funktion wird aufgerufen.

Erklärung

Die Reihenfolge der Auswertung von Argumenten in std::cout wird vom C-Standard nicht festgelegt, außer in einigen spezifischen Fällen, z logische Operatoren (&&, ||) und der ternäre Operator (? :).

In diesem Beispiel steht es dem Compiler frei, die Argumente in beliebiger Reihenfolge auszuwerten wählt. In diesem Fall wird zuerst die Funktion foo ausgewertet, wodurch der Wert von test auf 1,0 geändert wird. Der in der std::cout-Anweisung gespeicherte Wert von test beträgt jedoch immer noch 0,0, da die std::cout-Anweisung ausgewertet wird, bevor die foo-Funktion aufgerufen wird.

Lösung

Um die gewünschte Reihenfolge der Auswertung sicherzustellen, sollte der Code wie folgt umgeschrieben werden:

std::cout << "Value of test before function call: " << test << std::endl;
foo(test);
std::cout << "Value of test after function call: " << test << std::endl;

Dadurch wird sichergestellt, dass der Test vor und ausgewertet wird nach dem Funktionsaufruf foo wird die erwartete Ausgabe erzeugt:

Value of test before function call: 0
Value of test after function call: 1

Das obige ist der detaillierte Inhalt vonWie wirkt sich die Reihenfolge der Argumentauswertung auf die Ausgabe von „std::cout' in C aus?. 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