Maison >développement back-end >C++ >Comment l'ordre d'évaluation des arguments affecte-t-il la sortie `std::cout` en 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!