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
480 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!

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