Évaluation des arguments dans l'ordre d'insertion std::cout
En C, l'ordre d'évaluation des arguments dans les expressions utilisant l'insertion std::cout l’opérateur peut prêter à confusion. Considérez l'extrait de 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 de ce code est surprenant :
Value of test is : 1 Return value of function is : 1 Value of test : 0
Comprendre ce résultat nécessite de se plonger dans l'ordre d'évaluation des arguments.
Ordre d'évaluation non spécifié
En général, C ne spécifie pas l'ordre d'évaluation des arguments dans un expression. C'est au compilateur de décider. Il existe cependant quelques exceptions, comme :
Hypothèse d'évaluation de gauche à droite
Il est courant de supposer une évaluation de gauche à droite pour std::cout insertions, mais cela n'est pas garanti. Dans notre exemple, le test "shadowé" du troisième argument est évalué avant l'appel à foo, qui le modifie.
Résoudre la confusion
Pour garantir le résultat prévu ordre d'évaluation, divisez l'expression en instructions distinctes :
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;
Ce code affiche correctement :
Value of test is : 0 Return value of function is : 1 Value of test : 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!