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 matriz

  • Uma expressão de seleção de membro (-> ou .)

  • Uma expressão de indireção unária (*) que não se refere a uma matriz

  • Uma 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

Confira também

Operandos e expressões