Pourquoi i = i 1; Devenu légal en C 17
En C 11, l'extrait de code "i = i 1;" invoqué un comportement indéfini. Cependant, dans la C 17, ce code est devenu légalement acceptable. Ce changement découle des garanties de séquençage améliorées introduites dans C 17.
Selon la norme C 11 [N3337 basic.exec], le séquençage des effets secondaires n'est pas séquencé sauf indication contraire explicite. Dans l'exemple de code, l'opérateur d'affectation (=) et l'opérateur d'incrémentation postfixe ( ) ont tous deux des effets secondaires qui peuvent conduire à un comportement indéfini s'ils ne sont pas correctement séquencés.
En C 17, une nouvelle phrase a été ajoutée à [ N4659 expr.ass] qui clarifie les règles de séquençage pour l'opérateur d'affectation :
The right operand is sequenced before the left operand.
Cette instruction supplémentaire garantit que tous les effets secondaires dans l'opérande de droite sont exécutés avant tout effet secondaire dans l'opérande de gauche, y compris l'affectation lui-même.
Dans le cas de "i = i 1;", l'opérande droit (i 1) est constitué de l'opérateur d'incrémentation postfixe (i ) et de la constante 1. Les garanties de séquençage introduites dans C 17 garantissent que l'incrément postfix est effectué et son effet secondaire se produit avant l'exécution de l'affectation. Cela élimine le comportement indéfini qui était présent dans C 11.
Par conséquent, les garanties de séquençage améliorées dans C 17 ont fait "i = i 1;" légal en garantissant que les effets secondaires des opérandes droit et gauche sont correctement séquencés, empêchant ainsi un comportement indéfini.
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!