Isso diz respeito a lvalues e rvalues em C e C ++.
Na linguagem de programação C, os operadores de pré-incremento e pós-incremento retornam rvalues, não lvalues. Isso significa que eles não podem estar no lado esquerdo do =
operador de atribuição. Ambas as instruções fornecerão um erro do compilador em C:
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
No entanto, em C ++, o operador de pré-incremento retorna um lvalue , enquanto o operador de pós-incremento retorna um rvalue. Isso significa que uma expressão com o operador de pré-incremento pode ser colocada no lado esquerdo do =
operador de atribuição!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
Agora, por que isso é assim? O pós-incremento incrementa a variável e retorna a variável como era antes do incremento. Este é realmente apenas um rvalue. O valor anterior da variável a é copiado em um registrador como temporário e a é incrementado. Mas o valor anterior de a é retornado pela expressão, é um rvalue. Já não representa o conteúdo atual da variável.
O pré-incremento primeiro incrementa a variável e, em seguida, retorna a variável como era depois que o incremento ocorreu. Nesse caso, não precisamos armazenar o valor antigo da variável em um registro temporário. Apenas recuperamos o novo valor da variável depois que ela foi incrementada. Portanto, o pré-incremento retorna um valor l, retorna a variável a própria. Podemos usar atribuir esse valor a outra coisa, é como a declaração a seguir. Esta é uma conversão implícita de lvalue em rvalue.
int x = a;
int x = ++a;
Como o pré-incremento retorna um valor l, também podemos atribuir algo a ele. As duas instruções a seguir são idênticas. Na segunda atribuição, primeiro a é incrementado e, em seguida, seu novo valor é substituído por 2.
int a;
a = 2;
++a = 2; // Valid in C++.