différence entre l’expression de c et celle de c ++

int main() { int i=3; (++i)++; printf("%d",i); } 

Ce programme fonctionne avec le compilateur g ++ mais pas avec gcc. Si j’écris i ++++ ou ++ i ++, cela ne fonctionne pas non plus dans cpp. Je pense qu’il y a une différence entre c-expression et c ++ – expression. Quelqu’un peut-il expliquer la valeur L et la valeur R?

Edit: Cette réponse est incorrecte pour la question mise à jour, elle s’applique à la question telle que formulée à l’origine.

(i++)++ ne devrait pas fonctionner avec gcc ou g ++, qu’ils parsingnt ou non le fichier en tant que C ou C ++ dans les deux langages. L’incrémentation postfixée nécessite une valeur comme opérande et le résultat est une valeur r .

(Notez que rvalue n’est utilisé formellement qu’en C ++. En C, les résultats des expressions sont soit explicitement des lvalues, soit tout simplement pas des lvalues . Le terme rvalue n’est pas utilisé du tout dans le texte normatif du standard C.)

De manière simpliste, une valeur est une expression qui fait référence à un object, c’est-à-dire, conceptuellement, à une région de stockage. Une lvalue modifiable est une chose à laquelle il est valide d’affecter et qui peut donc apparaître à gauche d’une expression d’affectation.

Une valeur rvalue est simplement une valeur, quelque chose à partir de laquelle vous pouvez affecter une valeur modifiable, mais pas quelque chose que vous pouvez affecter. Il ne peut apparaître que du côté droit d’une expression d’affectation.

g++ me donne l’erreur suivante: lvalue required as increment operand .

L’incrément de préfixe (et le décrément) sont légèrement différents. En C ++, le résultat d’une incrémentation de préfixe est explicitement une valeur lvalue (5.3.2 / 1 [expr.pre.incr]); en C ce n’est pas explicitement une valeur (6.5.3.1 indique que ++ E est équivalent à (E + = 1); 6.5.16 indique que le résultat d’une affectation n’est pas une valeur).

(++i)++ est donc sémantiquement correct uniquement en C ++, mais son comportement est indéfini car vous stockez une valeur deux fois dans un object sans sharepoint séquence intermédiaire.

De wiki:

Certaines langues utilisent l’idée de lvalues ​​et de rvalues. Les valeurs sont des valeurs dont les adresses sont accessibles par programme au programme en cours (par exemple, via une adresse-de-opérateur telle que “&” en C ++), ce qui signifie qu’il s’agit de variables ou de références déréférencées vers un certain emplacement mémoire. Les valeurs peuvent être des valeurs (voir ci-dessous) ou des non-valeurs, terme utilisé uniquement pour distinguer les valeurs. En C, le terme lvalue signifiait à l’origine quelque chose qui pouvait être assigné (venant de la valeur de gauche, indiquant que c’était du côté gauche de l’opérateur d’affectation), mais puisque ‘const’ a été ajouté à la langue, on l’appelle maintenant ‘lvalue modifiable’.

$ 5.2.6-

La valeur obtenue en appliquant un postfix ++ est la valeur qu’avait l’opérande avant d’appliquer l’opérateur. [Remarque: la valeur obtenue est une copie de la valeur d’origine] L’opérande doit être une valeur modifiable. Le type de l’opérande doit être un type arithmétique ou un pointeur sur un type d’object complet. Une fois le résultat noté, la valeur de l’object est modifiée en lui ajoutant 1, sauf si l’object est de type bool, auquel cas il est défini sur true. [Remarque: cette utilisation est déconseillée, voir annexe D.] Le résultat est une valeur r. Le type du résultat est la version non qualifiée cv du type de l’opérande. Voir aussi 5.7 et 5.17.

5.3.2 $ / 1-

“L’opérande du préfixe ++ est modifié en ajoutant 1 ou défini sur true s’il est bool (cette utilisation est déconseillée). L’opérande doit être une valeur modifiable.

Cela devrait expliquer l’erreur que vous obtenez pour C ++.