Maison  >  Article  >  développement back-end  >  Pourquoi \"i = i 1\" est-il légal en C 17 mais un comportement indéfini en C 11 ?

Pourquoi \"i = i 1\" est-il légal en C 17 mais un comportement indéfini en C 11 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-27 09:53:30262parcourir

Why is

Rendre i = i 1 légal en C 17

En C 11, l'expression "i = i 1" est un comportement indéfini dû à des garanties de séquençage insuffisantes. Cependant, en C 17, cette expression devient légale. Voici pourquoi :

C 11

En C 11, les règles de séquençage de l'opérateur d'affectation (=) indiquaient que l'affectation était séquencée après le calcul de la valeur du droit et les opérandes gauches. Cependant, aucune règle spécifique n'existait pour l'ordre relatif de l'affectation et des effets secondaires dans l'opérande droit. Ce manque de séquençage a conduit à un comportement indéfini dans des cas comme "i = i 1", où l'effet secondaire (incrémentation de i) et l'affectation étaient potentiellement non séquencés.

C 17

C 17 introduit une nouvelle règle de séquençage pour l'opérateur d'affectation : "L'opérande de droite est séquencé avant l'opérande de gauche." Cela signifie que tous les effets secondaires et calculs de valeurs au sein de l'opérande de droite sont entièrement séquencés avant qu'une action n'ait lieu sur l'opérande de gauche, y compris l'affectation elle-même.

Effet sur "i = i 1"

Avec la nouvelle règle de séquençage en C 17, l'expression "i = i 1" devient légale car l'effet secondaire de l'incrémentation de i (effectué par l'opérateur postfix) est désormais garanti avant l'affectation. Par conséquent, l'acte d'attribuer la valeur de "i 1" à i est entièrement isolé de l'effet secondaire, éliminant le comportement indéfini qui existait dans C 11.

En résumé, le changement dans les règles de séquençage pour l'affectation L'opérateur en C 17 garantit que l'évaluation de "i = i 1" suit une séquence spécifique, permettant à l'effet secondaire de l'incrémentation de i de précéder l'affectation elle-même, résolvant le comportement indéfini qui existait en C 11.

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