Cela concerne les lvalues et les rvalues en C et C ++.
Dans le langage de programmation C, les opérateurs de pré-incrémentation et de post-incrémentation renvoient rvalues, pas lvalues. Cela signifie qu'ils ne peuvent pas être sur le côté gauche de l' =
opérateur d'affectation. Ces deux instructions donneront une erreur de compilation en C:
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
En C ++ cependant, l'opérateur de pré-incrémentation renvoie une valeur l , tandis que l'opérateur de post-incrémentation renvoie une valeur r. Cela signifie qu'une expression avec l'opérateur de pré-incrémentation peut être placée sur le côté gauche de l' =
opérateur d'affectation!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
Maintenant, pourquoi en est-il ainsi? Le post-incrément incrémente la variable, et il renvoie la variable telle qu'elle était avant l'incrémentation ne se produise. C'est en fait juste une valeur r. L'ancienne valeur de la variable a est copiée dans un registre comme temporaire, puis a est incrémentée. Mais l'ancienne valeur de a est renvoyée par l'expression, c'est une valeur r. Il ne représente plus le contenu actuel de la variable.
La pré-incrémentation incrémente d'abord la variable, puis elle renvoie la variable telle qu'elle est devenue après l'incrémentation. Dans ce cas, nous n'avons pas besoin de stocker l'ancienne valeur de la variable dans un registre temporaire. Nous récupérons simplement la nouvelle valeur de la variable après son incrémentation. Ainsi, le pré-incrément renvoie une valeur l, il renvoie la variable a elle-même. Nous pouvons utiliser assigner cette valeur à quelque chose d'autre, c'est comme l'instruction suivante. Il s'agit d'une conversion implicite de lvalue en rvalue.
int x = a;
int x = ++a;
Puisque le pré-incrément renvoie une valeur l, nous pouvons également lui attribuer quelque chose. Les deux déclarations suivantes sont identiques. Dans la deuxième affectation, d'abord a est incrémenté, puis sa nouvelle valeur est remplacée par 2.
int a;
a = 2;
++a = 2; // Valid in C++.