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:

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.

8.8. Alocarea dinamica a memoriei