Maison >développement back-end >C++ >Comment l'ordre d'évaluation des arguments affecte-t-il la sortie `std::cout` en C ?

Comment l'ordre d'évaluation des arguments affecte-t-il la sortie `std::cout` en C ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-01 10:45:111036parcourir

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

Ordre d'évaluation dans les arguments std::cout

L'ordre d'évaluation des arguments transmis à std::cout peut prêter à confusion, en particulier lorsqu'un ou plusieurs arguments sont un appel de fonction qui modifie la valeur d'un autre argument.

Code Exemple

Considérez l'extrait de code C suivant :

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

Sortie inattendue

Une fois exécuté, ce code produit la sortie suivante :

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

Ce résultat peut paraître surprenant, car on pourrait s'attendre à ce que la valeur de test soit 1 après le la fonction foo est appelée.

Explication

L'ordre d'évaluation des arguments dans std::cout n'est pas spécifié par le standard C, sauf quelques cas particuliers comme comme opérateurs logiques (&&, ||) et l'opérateur ternaire (? :).

Dans cet exemple, le compilateur est libre d'évaluer les arguments dans n'importe quel ordre. choisit. Dans ce cas, la fonction foo est évaluée en premier, modifiant la valeur de test à 1,0. Cependant, la valeur de test stockée dans l'instruction std::cout est toujours 0,0, car l'instruction std::cout est évaluée avant l'appel de la fonction foo.

Solution

Pour garantir l'ordre d'évaluation souhaité, le code doit être réécrit comme suit :

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

Cela garantit que le test est évalué avant et après l'appel de la fonction foo, produisant le résultat attendu :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn