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
Libérer: 2024-12-18 20:13:14
original
220 Les gens l'ont consulté

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;
}
Copier après la connexion

Le résultat attendu de ce code est :

Value of test is :    1    Return value of function is : 1    Value of test : 1
Copier après la connexion

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
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal