3.2.7. Operatorii de atribuire

2019/01/25 in Programare in C

Operatorul de atribuire, in forma cea mai simpla, se noteaza prin caracterul "=". El se utilizeaza in expresii de forma:

v=(expresie)

unde:

v este o variabila simpla, referentiaza un element de tablou (variabila cu indici) sau de structura.

Operatorul de atribuire are o prioritate mai mica decat toti operatorii pe care i-am intalnit pana in prezent. De aceea, parantezele din constructia de mai sus, de obicei, nu sunt necesare.

Operatorul de atribuire are ca efect atribuirea valorii expresiei aflata in dreapta semnului de atribuire variabilei v. In stanga semnului de atribuire se poate afla chiar o expresie ce defineste o adresa.

La o atribuire se face si o conversie, daca este necesar. Astfel, valoarea expresiei din dreapta semnului de atribuire se va converti spre tipul variabilei din stanga lui inainte de a se face atribuirea, daca cele doua tipuri sunt diferite.

Expresia v=expresie este o expresie de atribuire. Ea are ca valoare valoarea care se atribuie, iar ca tip, tipul variabilei v.

Rezulta ca o constructie de forma:

v1=(v=expresie)

este corecta si reprezinta tot o expresie de atribuire. Lui v1 i se atribuie valoarea atribuita in prealabil lui v, facandu-se si o conversie daca este necesar.

Deoarece operatorii de atribuire se asociaza de la dreapta spre stanga, expresia de mai sus se poate scrie fara paranteze:

v1=v=expresie

In general, o expresie de atribuire are forma:

vn=...=v1=v=expresie

Valoarea expresiei aflate in partea dreapta se atribuie intai lui v, apoi lui v1 si asa mai departe si in final se atribuie lui vn. Atribuirile sunt precedate de conversii in cazul in care valoarea care se atribuie este de un tip diferit fata de tipul variabilei la care se face atribuirea.

Pentru operatorii de atribuire, in afara semnului = se mai poate folosi si succesiunea de caractere:

op=

unde:

op este un operator binar aritmetic sau logic pe biti.
Deci op poate fi unul din operatorii:
/, %, *, -, +, <<, >>, &, ^, |.

Aceasta constructie se foloseste pentru a face prescurtari. Expresia:

v op=expresie

este echivalenta cu expresia de atribuire:

v=v op(expresie)

Expresiile de atribuire pot fi folosite peste tot in program unde este legal sa apara o expresie, ceea ce permite compactari in programul sursa.

Exemple:

1.

int a;
a=10

Variabilei a i se atribuie valoarea 10.

2.

int i;
i=i+3

Valoarea variabilei i se mareste cu 3.

3.

int i;
i+=3

Are acelasi efect ca si expresia din exemplul precedent.

4. Expresia de atribuire:

a[i*3+10][j*2-3]=a[i*3][j*2-3]*x

se scrie prescurtat astfel:

a[i*3+10][j*2-3]*=x

Exercitii:

3.14. Sa se scrie un program care citeste valoarea lui x, calculeaza valorile expresiilor:

si afiseaza valorile respective.

#include <stdio.h>

main()
{
    double x, y;

    scanf("%lf\n", &x);
    printf("x = %g\ty = 4x*x+3x = %g\n", x, y=4*x*x+3*x);
    printf("4x*x + 3x + 1 = %g\t (4x*x+3x-1)/(4x*x+3x+1) = %g\n", y, (y-1)/(y+1));
}

Observatie:

Parametrul y=4*x*x+3x din primul apel al functiei printf este o expresie de atribuire. Prin intermediul ei se atribuie lui y valoarea expresiei 4*x*x+3x

Valoarea expresiei de atribuire coincide cu valoarea atribuita lui y. Tipul expresiei de atribuire coincide cu tipul lui y, care este double.

3.15. Sa se scrie un program care citeste valoarea lui x, calculeaza si afiseaza valorile expresiilor:

#include <stdio.h>

main()
{
    double x, y, z;

    scanf("%lf\n", &x);
    printf("x = %g\n\tx**10 = %g\n", x, y = pow(x, 10.0));
    printf("\tx**20 = %g\n", z=y*y);
    printf("\tx**30 = %g\n", y*z);
    printf("\tx**40 = %g\n", z*z);
}

3.16. Sa se scrie un program care citeste valoarea lui x, afiseaza valorile lui x, [x], {x} si ale expresiilor:

unde:

#include <stdio.h>

main()
{
    int i;
	double x, y;

    scanf("%lf\n", &x);
    printf("x = %g\n", x);
    printf("[x] = %d\n", i = x);
    printf("{x} = %f\n", y = x - i);
    printf("7[x][x] - 3[x] + 10 = %d\n", 7*i*i-3*i+10);
    printf("7{x}{x} - 3{x} + 10 = %f\n", 7*y*y-3*y+10);
}

3.2.8. Operatorii de incrementare si decrementare