« Programmation C/Opérateurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Tados (discussion | contributions)
Ligne 154 :
</source>
 
Il est important de noter que le langage ne fait que garantir qu'une variable post-incrémentée ou post-décrémentée acquiert sa nouvelle valeur entre le résultat de l'opérateur et le prochain point de séquencement atteint (généralement la fin d'une instruction). Mais on ne sais pas vraiment quand entre les deux. Ainsi, si l'objet sur lequel s'applique un tel opérateur apparaît plusieurs fois avant un point de séquencement, alors le résultat est '''imprévisible''' et son comportement peut changer simplement en changeant les options d'un même compilateur&nbsp;:
 
{{Erreur volontaire|nombre=32}}
<source lang="c">
/* Le code qui suit est imprévisible */
int i = 0;
i = i++;
</source>
 
{{Erreur volontaire}}
/* Ou de façon moins évidente */
<source lang="c">
j = f(++i, 22, i);
/* Et celui-là d'après vous ? */
int i = 0;
i = ++i;
</source>
 
Contrairement à ce à quoi vous pouviez vous attendre, le bout de code ci-dessous n'est pas mieux défini que celui d'au-dessus. La valeur de i y est modifiée une première fois lors de son incrémentation, puis une deuxième fois par l'opérateur d'affectation <code>=</code>. Or, un autre moyen de générer un comportement indéfini est de modifier la valeur d'une variable plusieurs fois entre deux points de séquencement.
 
=== Promotion entière ===