2013-07-14 2 views
0

Si une lvalue apparaît dans une situation dans laquelle le compilateur attend une valeur, le compilateur convertit la valeur lvalue en valeur rvalue.Lorsque la conversion exacte de la valeur L en valeur R se produit en C

Une valeur de type T peut être convertie en valeur si T n'est pas une fonction ou un type de tableau. Le type de e après conversion sera T.

quelqu'un peut-il dire quand le compilateur attend Rvalue .ou quelles sont les règles exaclty telles qu'une expression réductrice à Lvalue est convertie en Rvalue. en C quand nous essayons de déclarer tableau de taille variable

int b=8; 
    int a[2*b];  //compiler gives error that constant expression reqd. what is this constant expression (is it rvalue expression) 

mais quand je fais

int a[10]; 
a[2*b]=89; 

ne donne aucune erreur plz quelqu'un quand Lvalue à Elaborer rvalue conversion se passe-t ?? ma confusion est que, dans un indice de tableau dans le premier cas, il lValue à rvalue convesion ne se passe pas (au moment de la déclaration) mais dans le deuxième cas, il arrive

+0

[Variable length arrays] (http: //en.wikipedia.org/wiki/Variable-length_array) (comme dans votre premier exemple) est autorisé, peut-être utilisez-vous un ancien compilateur? –

+0

Quel compilateur utilisez-vous, car gcc supporte VLA même en C90 en tant qu'extension. – 0decimal0

Répondre

1

Il semble que vous êtes peut-utilisez un ancien compilateur ou peut-être tableau de longueur variable (VLA) le support doit être activé? VLA est pris en charge depuis c99, si vous utilisez gcc vous pouvez voir plus clairement, la compilation de ce code exemple:

int main() 
{ 
    int b=8; 
    int a[2*b]; 

    return 0 ; 
} 

avec les options suivantes:

gcc -std=c89 -pedantic 

vous verrez cette erreur:

warning: ISO C90 forbids variable length array ‘y’ [-Wvla] 

si vous utilisez c99 bien que ce soit bien:

gcc -std=c99 -pedantic 

mais il est important de noter qu'à partir de 2011, le support C standard VLA est maintenant optionnel.

Un lvalue est un objet qui possède un emplacement de mémoire alors qu'un rvalue est une valeur temporaire qui ne persiste généralement pas au-delà de la fin d'une expression. Cet article Understanding lvalues and rvalues in C and C++ est probablement l'une des explications les plus détaillées. Dans ce cas 2*b est rvalue car il ne persiste pas au-delà de l'expression.

+0

okay..mais que diable est Lvalue et Rvalue? – Duggs

+0

@Duggs_Dojo Mis à jour avec plus de détails. –

0

Une valeur de lvalue a une identité (nom) et ne peut pas être déplacée. et Rvalue est une valeur pas une lvalue. Donc il y a deux concepts (est-ce que c'est un nom? Est-il mobile?) Qui sont utilisés pour définir ce qu'est une lvalue et ce qu'est une valeur.

La valeur pure (prvalue) n'a pas de nom et est déplaçable. Il y a aussi des valeurs x et x associées à ce concept.

La norme C++ 11 pour la conversion lvalue et rvalue se trouve au chapitre 4.1 (page 85 pour la version 3485). Vous pouvez également lire Does initialization entail lvalue-to-rvalue conversion? Is `int x = x;` UB?

Questions connexes