Lvalues

Uma expressão que identifica um espaço de memória que armazena um valor é chamada de lvalue, porque é uma localização que pode armazenar um valor.

Os tipos padrão de lvalues são:

  • Uma variável.

  • Uma expressão de desreferenciamento de ponteiro (veja ) usando o unário ‘*’.

  • Uma referência a um campo de estrutura (veja ) usando ‘.’, se o valor da estrutura for um lvalue.

  • Uma referência a um campo de estrutura usando ‘->’. Isso é sempre um lvalue já que ‘->’ implica desreferenciamento de ponteiro.

  • Uma referência a uma alternativa de união (veja ), nas mesmas condições que para campos de estruturas.

  • Uma referência a um elemento de um array usando ‘[…]’, se o array for um lvalue.

Se a operação mais externa de uma expressão for qualquer outro operador, essa expressão não é um lvalue. Assim, a variável x é um lvalue, mas x + 0 não é, mesmo que essas duas expressões calculem o mesmo valor (supondo que x seja um número).

Um array pode ser um lvalue (as regras acima determinam se ele é um), mas usar o array em uma expressão o converte automaticamente em um ponteiro para o elemento zero. O resultado dessa conversão não é um lvalue. Portanto, se a variável a for um array, você não pode usá-la sozinha como o operando esquerdo de uma atribuição. Mas você pode atribuir a um elemento de a, como a[0]. Isso é um lvalue, já que a é um lvalue.

Atualizado