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 fazem referência aos locais modificáveis são chamadas “l-values modificáveis”. Um l-value modificável não pode ter um tipo de 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 devem 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 seja avaliada como uma matriz
Uma expressão member-selection (–> ou .)
Uma expressão unary-indirection (*) que não faz referência 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.
Específico da Microsoft
O Microsoft C inclui uma extensão do padrão ANSI C que permite que as conversões de l- values sejam usadas como l-values, desde que o tamanho do objeto não seja alongado na conversão. (Consulte Conversões Type-Cast para obter mais informações.) O exemplo a seguir 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 de Específico da Microsoft