Point d\'ordre

Un point d'ordre de dans le de programmation impératif définit n'importe quel point dans le exécution de s de programme informatique un la 'à laquelle on le garantit que tous les effets secondaires des évaluations précédentes auront été exécutés, et aucun effet secondaire des évaluations suivantes n'a été encore exécuté. Il est souvent mentionné dans la référence au C et au C++ , parce que le résultat de quelques expressions peut dépendre de l'ordre de l'évaluation de leurs subexpressions. Ajouter un ou plusieurs points d'ordre est une méthode d'assurer un résultat cohérent, parce que ceci limite les ordres possibles de l'évaluation.

Exemples de l'ambiguïté

Considérer deux le f des fonctions () et le g () . L'opérateur de + n'est pas un point d'ordre et donc dans le f de l'expression () +g () , il est possible que le f () ou le g () sera exécuté d'abord. L'opérateur de virgule est un point d'ordre, et donc dans le f de code (), g () que l'ordre de l'évaluation est défini (c., le premier f () s'appelle, et alors le g () s'appelle). Il évalue au type et à la valeur de g () ;. le f () est évalué et la valeur est jetée.

Les points d'ordre héritent également le jeu quand la même variable est modifiée plus d'une fois. Un exemple souvent-cité est l'expression i=i++, que tous les deux assignent à i à lui-même et incrémentent i ; quelle est la valeur finale de i ? Les définitions de langue pourraient spécifier un des comportements possibles ou dire simplement le comportement est éliminé par . Dans C et C++, l'évaluation d'une telle expression rapporte le comportement non défini.

Points d'ordre dans C et C++

Dans C et C++, les points d'ordre se produisent dans les endroits suivants. (Dans C++, des points supplémentaires d'ordre peuvent être ajoutés par la surcharge d'opérateur.)

entre l'évaluation des opérandes gauches et droits du && ( logique ET ), || ( logique OU ), et opérateurs de virgule. Par exemple, dans l'expression *p++ ! = 0 && *q++ ! = 0, tous les effets secondaires de la secondaire-expression *p++ ! = 0 sont accomplis avant n'importe quelle tentative d'accéder au q.

  • Entre l'évaluation du premier opérande du " ternaire de ; question-mark" ; opérateur et le deuxième ou troisième opérande. Par exemple, dans le a d'expression = (*p++) ? (*p++) : 0 il y a un point d'ordre après le premier *p++, signifiant qu'il a été déjà incrémenté avant que le deuxième exemple soit exécuté.
  • À la fin d'une pleine expression. Cette catégorie inclut des rapports d'expression (tels que le a=b de tâche ; ), rapports de retour les expressions de contrôle de if, switch, while, ou rapports de do-while, et chacune des trois expressions dans un de pour le rapport de .
  • Avant une fonction est entré dans un appel de fonction. L'ordre dans lequel les arguments sont évalués n'est pas spécifié, mais ce point d'ordre signifie que tous leurs effets secondaires sont complets avant que la fonction soit écrite. Dans le f d'expression (i++) + g (j++) + h (k++) , f s'appelle avec un paramètre de la valeur originale de i, mais i est incrémenté avant d'entrer dans le corps de f. De même, j et k sont mis à jour avant d'écrire g et h respectivement. Cependant, on ne le spécifie pas dans quel f d'ordre () , le g () , le h () sont exécuté, ni dans quel ordre i, j, k sont incrémenté. Les valeurs de j et de k dans le corps de f sont donc éliminées. Noter qu'un appel de fonction A (b, c, d) n'est pas une utilisation de l'opérateur de virgule et l'ordre de l'évaluation pour b, c, d est non défini.
  • À l'extrémité d'un initialiseur ; par exemple, après 5 dans le int de déclaration a = 5 ; .
    Random links:Élection générale de la Nouvelle Zélande, 1984 | Pointe-Fortune, Québec | Const-exactitude | Machfeld | Kabah (bande)