7
votes

Commande d'appel de la fonction

pour l'expression xxx

fonctionnera Func1 () * Func2 () est évalué d'abord comme il comporte des supports ou que les fonctions peuvent être appelées dans n'importe quel ordre comme

premier Func3 () puis (Func1 () * Func2 ())

c c++

0 commentaires

6 Réponses :


14
votes

Les fonctions peuvent être appelées dans n'importe quel ordre.


0 commentaires

6
votes

Vous ne pouvez faire aucune hypothèse sur l'ordre dans lequel ces fonctions seront appelées. Il est parfaitement valide pour le compilateur d'appeler ces fonctions dans n'importe quel ordre, attribuez les résultats aux temporaires, puis utilisez ces valeurs temporaires pour calculer le résultat de l'expression.


0 commentaires

4
votes

Ces appels peuvent être effectués dans n'importe quel ordre. Vous voulez apprendre sur points de séquence C ++ points de séquence C ++ .


4 commentaires

"La définition de langue C ++ ne spécifie pas actuellement des points de séquence". C'est certainement une déclaration amusante.


Droite, besoin de trouver une meilleure référence :) Avez-vous un Johannes?


Qu'en est-il de Stackoverflow.com/questions/4176328/...


Merci John, je cherchais vraiment un moyen de relier directement au texte standard. Il suffit de remplacer le lien avec une Wikipedia Ref.



2
votes

Parenthèses dans l'ordre des opérations de la force C / C ++. FUNC1 () * FUNC2 () sera ajouté à Func3 () , mais le compilateur peut choisir d'appeler les fonctions dans n'importe quel ordre qu'il souhaite avant de passer aux résultats du Fonctionnement multiplication / addition.


0 commentaires

10
votes

La précédente des opérateurs n'a rien à faire avec l'ordre d'évaluation des opérandes.

La norme C ou C ++ ne détermine pas l'ordre dans lequel les fonctions seraient appelées. .

L'ordre d'évaluation des sous-expressions, y compris

  • Les arguments d'un appel de la fonction et
  • Opérandes d'opérateurs (par exemple , +, -, =, *, / ), à l'exception de:
    • Les opérateurs logiques binaires ( && et || ),
    • L'opérateur conditionnel ternaire (?: ), et
    • L'opérateur de la virgule (, )

      est non spécifié

      par exemple xxx


0 commentaires

2
votes

Il est naturel de penser que A + B est évalué avant C dans ce psudocode:

(A + B) * C

Mais en fait, ce n'est pas le cas. La norme indique que l'ordre d'évaluation pour toutes les expressions est "non spécifié", sauf indication contraire de la norme:

5/4 [EXPR]:

sauf si noté, l'ordre de Évaluation des opérandes d'individu opérateurs et subexpessions de expressions individuelles et la commande dans quels effets secondaires ont lieu, est non spécifié

La norme continue ensuite d'identifier une expression entre parenthèses comme une "expression primaire" mais ne spécifie pas l'ordre d'évaluation des expressions primaires. (5.1 / 5).

en normal, "non spécifié" ne signifie pas "indéfini". Cela signifie plutôt "la mise en œuvre définie, mais aucune documentation n'est requise." Donc, vous ne pourriez même pas ne pas être capable de dire quelle est l'ordre d'évaluation pour un compilateur spécifique.

Voici un programme simple illustrant le comportement: xxx

Sur mon MSVC10 en cours d'exécution à DEBUG / X64 sur Win7, la sortie est: xxx


0 commentaires