Expressões L-Value e R-Value
Expressões que fazem referência a locais de memória são chamadas de expressões “l-value”. Um l-value representa um valor de “localizador” da região de armazenamento ou um valor “à esquerda”, que indica que pode aparecer à esquerda do sinal de igual (=
). Os l-values frequentemente são identificadores.
Expressões que se referem a locais modificáveis são chamadas de "valores l modificáveis". Um valor l modificável não pode ter o tipo matriz, um tipo incompleto ou um tipo com o atributo const
. Para que as estruturas e uniões sejam l-values modificáveis, elas não podem ter membros com o atributo const
. O nome do identificador denota um local de armazenamento, enquanto o valor da variável é o valor armazenado nesse local.
Um identificador é um l-value modificável se ele fizer referência a um local de memória e se seu tipo for aritmético, de estrutura, de união ou ponteiro. Por exemplo, se ptr
for um ponteiro para uma região de armazenamento, então *ptr
é um l-value modificável que designa a região de armazenamento para a qual ptr
aponta.
Qualquer uma das seguintes expressões de C podem ser expressões l-value:
Um identificador do tipo integral, flutuante, ponteiro, de estrutura ou de união
Uma expressão subscrita (
[ ]
) que não é avaliada como matrizUma expressão de seleção de membro (
->
ou.
)Uma expressão de indireção unária (
*
) que não se refere a uma matrizUma expressão l-value entre parênteses
Um objeto
const
(um valor l-value não modificável)
O termo “r-value” é usado às vezes para descrever o valor de uma expressão e para diferenciá-lo de um l-value. Todos os l-values são r-values mas nem todos r-values são l-values.
Seção específica da Microsoft
O Microsoft C inclui uma extensão para o padrão ANSI C que permite que conversões de valores l sejam usadas como valores l, desde que o tamanho do objeto não aumente com a conversão. (Para obter mais informações, confira Conversões de tipo). O seguinte exemplo ilustra esse recurso:
char *p ;
short i;
long l;
(long *) p = &l ; /* Legal cast */
(long) i = l ; /* Illegal cast */
O padrão do Microsoft C é que as extensões da Microsoft sejam habilitadas. Use a opção de compilador /Za para desativar essas extensões.
Fim da seção específica da Microsoft