Expressions L-Value et R-Value
Les expressions qui font référence à des emplacements de mémoire sont appelées expressions « l-value ». Une l-value représente la valeur « localisateur » d’une zone de stockage, ou une valeur « gauche », ce qui implique qu’elle peut apparaître à gauche du signe égal à (=
). Les l-values sont souvent des identificateurs.
Les expressions faisant référence à des emplacements modifiables sont appelées « l-values modifiables ». Une l-value modifiable ne peut pas avoir un type de tableau, un type incomplet ou un type avec l’attribut const
. Pour que les structures et les unions soient des l-values modifiables, elles ne doivent comporter aucun membre défini avec l’attribut const
. Le nom de l'identificateur désigne un emplacement de stockage, alors que la valeur de la variable est la valeur stockée à cet emplacement.
Un identificateur est une l-value modifiable si elle fait référence à un emplacement mémoire et si son type est arithmétique, structure, union ou pointeur. Par exemple, si ptr
est un pointeur vers une zone de stockage, *ptr
est une l-value modifiable qui désigne la zone de stockage vers laquelle ptr
pointe.
Les expressions C suivantes peuvent être des expressions l-value :
Un identificateur de type intégral, flottant, pointeur, structure ou union
Une expression d’indice (
[ ]
) qui ne correspond pas à un tableauUne expression de sélection de membre (
->
ou.
)Une expression d’indirection unaire (
*
) qui ne fait pas référence à un tableauUne expression l-value entre parenthèses
Un objet
const
(une l-value non modifiable)
Le terme « r- value » est parfois utilisé pour décrire la valeur d'une expression et pour établir une distinction par rapport à une l-value. Toutes les l-values sont des r- values, mais les r- values ne sont pas toutes des l-values.
Section spécifique à Microsoft
Microsoft C inclut une extension vers la norme C ANSI qui permet d’effectuer un cast sur des l-values à utiliser en tant que l-values, à condition que la taille de l’objet ne soit pas rallongée lors de cette opération. (Pour plus d’informations, consultez Conversions de type cast.) L’exemple suivant illustre cette fonctionnalité :
char *p ;
short i;
long l;
(long *) p = &l ; /* Legal cast */
(long) i = l ; /* Illegal cast */
Par défaut pour Microsoft C, les extensions Microsoft sont activées. Utilisez l’option du compilateur /Za pour désactiver ces extensions.
FIN de la section spécifique à Microsoft