51 votes

Différence entre i++ et (i)++ en C

int i = 3;
int j = (i)++;

vs

int i = 3;
int j = i ++;

Y a-t-il une différence entre la façon dont les deux cas ci-dessus sont évalués ?

Le premier cas est-il équivalent à l'incrémentation d'une rvalue ou s'agit-il d'un comportement non défini ?

18 votes

L'utilisation apparemment arbitraire des parenthèses est courante dans les définitions de macros. Lorsqu'elles faire faire une grande différence, vous aimeriez le message d'erreur que vous obtenez. Enfin, en général.

3 votes

Il n'y a pas de différence pour les ints. Cependant, ce n'est pas toujours le cas et vous devez être prudent lorsque vous combinez des parenthèses et des opérateurs, @govin-parmar a montré un bon exemple de ce qui peut arriver avec les pointeurs.

1 votes

Pour être clair, les deux de ces cas sont bien définis (c'est-à-dire qu'ils ne sont pas UB) et stockeront 3 dans j .

94voto

Eric Postpischil Points 36641

i++ et (i)++ se comportent de manière identique. C 2018 6.5.1 5 dit :

Une expression entre parenthèses est une expression primaire. Son type et sa valeur sont identiques à ceux de l'expression non parenthésée. C'est une lvalue, un désignateur de fonction ou une expression vide si l'expression non parenthésée est, respectivement, une lvalue, un désignateur de fonction ou une expression vide.

Le libellé est le même en C 1999.

2 votes

Par souci d'exhaustivité, cela a-t-il toujours été le cas ? Je veux dire, je sais que ça a toujours été le cas, mais votre référence indique C 2018 (c'est-à-dire la dernière version), donc ça ne peut pas faire de mal de l'expliciter.

7 votes

@MrLister Oui, même la norme pré-ANSI C (1978) avait ce comportement. Ce n'est pas explicité formellement (si peu l'était), mais c'est requis pour certains exemples dans la première édition de K&R, tels que (*ptr)++ .

54voto

Govind Parmar Points 769

Dans votre exemple simple de i++ contre (i)++ il n'y a pas de différence, comme indiqué dans la réponse d'Eric Postpischil.

Cependant, cette différence est en fait significative si vous déréférencez une variable pointeur avec la fonction * et l'utilisation de l'opérateur d'incrémentation ; il y a une différence entre *p++ et (*p)++ .

La première instruction déréférence le pointeur puis incrémente le pointeur lui-même ; la seconde instruction déréférence le pointeur puis incrémente la valeur déréférencée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X