Maison >développement back-end >C++ >Pourquoi l'ordre d'évaluation des arguments dans `std::cout` n'est-il pas spécifié et comment puis-je garantir une sortie cohérente ?
Ordre d'évaluation des arguments dans std::cout
En C, l'ordre d'évaluation des arguments dans l'opérateur d'insertion de flux (std::cout) n’est pas précisé. Cela peut entraîner un comportement inattendu lorsque plusieurs arguments sont insérés simultanément.
Considérez le code 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; }
Le résultat attendu de ce code est :
Value of test is : 1 Return value of function is : 1 Value of test : 1
Cependant, le résultat réel peut varier en fonction du compilateur et de la plate-forme. Le code peut afficher :
Value of test is : 1 Return value of function is : 1 Value of test : 0
Cela est dû au fait que l'ordre d'évaluation des arguments dans l'instruction std::cout n'est pas défini. Dans le premier cas, test est évalué avant l'appel foo(), donc il imprime 1. Dans le second cas, test est évalué après l'appel foo(), donc il imprime 0.
Pour garantir un bon classement , divisez l'expression en plusieurs instructions :
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;
Cela garantit que foo(test) est évalué avant l'instruction std::cout, fournissant une sortie cohérente entre différents compilateurs et plateformes.
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!