Heim > Backend-Entwicklung > C++ > Warum ist die Argumentauswertungsreihenfolge std::cout in C unvorhersehbar?

Warum ist die Argumentauswertungsreihenfolge std::cout in C unvorhersehbar?

Susan Sarandon
Freigeben: 2024-12-26 15:46:26
Original
425 Leute haben es durchsucht

Why is std::cout Argument Evaluation Order Unpredictable in C  ?

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;
}
Nach dem Login kopieren

Die Ausgabe dieses Codes ist überraschend:

Value of test is :      1       Return value of function is : 1 Value of test : 0
Nach dem Login kopieren

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:

  • Sequenzpunkte, die durch bestimmte Operatoren wie && und || eingeführt werden
  • Der ternäre Operator

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;
Nach dem Login kopieren

Dieser Code gibt korrekt Folgendes aus:

Value of test is : 0
Return value of function is : 1
Value of test : 1
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage