# 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 [Desreferenciamento de Ponteiro](#user-content-fn-1)[^1]) usando o unário ‘\*’.
* Uma referência a um campo de estrutura (veja Estruturas[^1]) 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 Uniões[^1]), 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*.

[^1]: Capítulo pendente de tradução
