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 ?

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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-18 20:13:14236parcourir

Why is the Order of Argument Evaluation in `std::cout` Unspecified, and How Can I Ensure Consistent Output?

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!

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