8.7. Expresie lvalue
2019/03/16 in Programare in C
In paragraful
3.2.7.
s-a definit expresia de atribuire prin urmatorul format: (1) v = expresie
, unde:
v | se considera ca este o variabila simpla, o variabila cu indici (permite accesul sau modificarea valorii unui element din tablou) sau defineste un element de structura. |
Definitia expresiei de atribuire poate fi completata in momentul de fata adaugand formatul: (2) *ep = expresie
, unde:
ep | este o expresie care defineste un pointer nenul si care nu este un pointer spre o zona constanta. Astfel de expresii s-au utilizat deja in paragrafele precedente. |
Exemplu:
int n;
double x;
void *p;
Expresiile de atribuire de forma: n = 123, x = 3.14159
corespund formatului (1), indicat mai sus pentru expresiile de atribuire.
Fie:
p = &n;
atunci am vazut ca atribuirea:
*(int *)p = 123;
realizeaza acelasi lucru ca si expresia:
n = 123;
Expresia:
(int *)p
defineste un pointer spre o zona care nu este constanta si deci atribuirea de mai sus corespunde formatului (2) al expresiilor de atribuire. In mod analog, daca:
p = &x;
atunci atribuirea:
*(double *)p = 3.14159;
realizeaza acelasi lucru ca si expresia:
x = 3.14159;
Expresiile utilizabile in partea stanga a unei expresii de atribuire se numesc expresii lvalue.
Litera l provine de la cuvantul engezesc left (stanga).
Notiunea de expresie lvalue apartine autorilor limbajului C.
Ulterior s-a introdus si notiunea de expresie rvalue, care este o expresie care se poate utiliza in partea dreapta a unei expresii de atribuire, dar nu si in partea stanga.
Din cele de mai sus rezulta ca o expresie lvalue poate fi:
- un nume de variabila simpla;
- o variabila cu indici;
- o constructie ce permite accesul sau modificarea unui element de structura;
- o constructie de forma
*ep
unde:
ep este o expresie care defineste un pointer nenul spre o data care nu este constanta.
Fie declaratiile:
const int *a = 100;
int b;
In acest caz, a este un pointer spre o zona constanta si de aceea, expresia:
*a = 123;
nu este corecta. In acest caz *a nu este o expresie lvalue. Ea este o expresie rvalue, deoarece se poate utiliza in partea dreapta a expresiilor de atribuire.
Intr-adevar, expresia:
b = *a;
este corecta si atribuie variabilei b valoarea 100.