Maison > développement back-end > C++ > Pourquoi l'ordre d'évaluation des arguments std::cout est-il imprévisible en C ?

Pourquoi l'ordre d'évaluation des arguments std::cout est-il imprévisible en C ?

Susan Sarandon
Libérer: 2024-12-26 15:46:26
original
425 Les gens l'ont consulté

Why is std::cout Argument Evaluation Order Unpredictable in C  ?

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

Le résultat de ce code est surprenant :

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

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 :

  • Points de séquence introduits par certains opérateurs, comme && et ||
  • L'opérateur ternaire

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

Ce code affiche correctement :

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

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