Maison >développement back-end >C++ >« i = i 1 » est-il légalement défini dans C 17 ?

« i = i 1 » est-il légalement défini dans C 17 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 03:02:02661parcourir

 Is `i = i     1`  Legally Defined in C  17?

Légalité de i = i 1 en C 17

C 17 a introduit un changement subtil mais significatif qui a légalisé l'expression i = i 1 ; , ce qui était un comportement auparavant indéfini en C 11.

Avant C 17

En C 11, l'ordre d'évaluation d'une expression d'affectation était spécifié comme suit :

  • Les calculs de valeurs des opérandes droit et gauche sont séquencés avant l'affectation proprement dite.
  • Cependant, il n'y avait aucune exigence de séquençage spécifique entre l'affectation elle-même et les effets secondaires potentiels dans le côté droit ( RHS).

Dans le cas de i = i 1;, cela signifiait que l'effet secondaire de l'incrémentation de i à l'aide de l'opérateur suffixe pouvait se produire avant ou après l'affectation. Ce manque de séquençage a conduit à un comportement indéfini.

Modifications apportées au C 17

C 17 a introduit une phrase supplémentaire à la spécification de l'opérateur d'affectation : "L'opérande de droite est séquencé avant l'opérande de gauche. Cet ajout apparemment inoffensif a des implications considérables.

En séquençant le RHS avant le LHS, C 17 garantit désormais que tous les effets secondaires du RHS se produiront avant l'affectation elle-même. Cela isole efficacement l'action d'affectation de tout comportement potentiel non défini.

Réécriture de l'exemple

Pour illustrer ce changement, décomposons l'évaluation de i = i 1 ; en C 17 :

  1. Calcul de la valeur de l'opérande droit (RHS) : i 1

    • Incrémenter i à l'aide de suffixe (effet secondaire).
    • Ajoutez 1 à la valeur incrémentée.
  2. Séquençage du RHS avant LHS :

    • Tous les effets secondaires dans le RHS (y compris l'incrément) se produisent .
  3. Calcul de la valeur de l'opérande gauche (LHS) : i

    • La valeur actuelle de i est utilisée.
  4. Affectation :

    • Attribuer le résultat du RHS au LHS.

En veillant à ce que tous les effets secondaires dans les RHS précèdent l'affectation, C 17 élimine définitivement la possibilité d'un comportement indéfini dans de telles expressions.

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:
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