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 lef 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. 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é. 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 . 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. 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)