Operatori si expresii de asignare
Expresii de tipul:
i = i + 2
in care membrul sting este repetat in membrul drept pot fi scrise
intr-o forma condensata:
i += 2
folosind operatorul de asignare +=.
Majoritatea operatorilor binari (operatori ca +, care
au un operand sting si un operand drept) au un operator de
asignare corespunzator "op=&qu 737l1111h ot;, unde op este unul din:
+ - * / % << >> & ^ |
Daca e1 si e2 sint doua expresii, atunci:
e1 op= e2
este echivalent cu
e1 = (e1) op (e2)
cu exceptia ca e1 este calculat o singura data. Sa remarcam
parantezele din jurul lui e2:
x *= y + 1
inseamna de fapt
x = x * (y + 1)
si nu
x = x * y + 1
Dam in continuare, drept exemplu, functia bitcount, care conto-
rizeaza numarul de biti pe 1 dintr-un argument intreg.
bitcount(n) /* contorizeaza bitii 1 din n */
unsigned n;
Lasind la o parte conciziunea, operatorii de asignare au
avantajul ca ei corespund cel mai bine modului de gindire al
oamenilor. Noi spunem "adunam 2 la i" sau " incrementam pe i cu 2"
si nu "ia-l pe i, aduna 2, apoi pune rezultatul inapoi in i". Deci
i += 2. In plus, pentru o expresie complicata, de tipul:
yyval[yypv[p3 + p4] + yypv[p1 + p2]] += 2
operatorul de asignare face codul mai usor de inteles, deoarece
cititorul nu trebuie sa verifice sirguincios ca cele doua
expresii sint intr-adevar o aceeasi sau sa se intrebe de ce
nu sint. In plus, un operator de asignare ajuta chiar compilatorul
sa produca un cod mai eficient.
Am folosit deja faptul ca o instructiune de asignare are o
valoare si ca poate sa apara in expresii; exemplul cel mai comun:
while ((c = getchar()) != EOF)
...
Asignarile folosind alti operatori de asignare (+=, -=, etc)
pot deasemenea sa apara in expresii, cu toate ca acestea se intim-
pla mai rar.
Tipul unei expresii de asignare este tipul operandului sau sting.
Exercitiul 2.9. Intr-un sistem cu numere cu complement fata
de 2, x & (x-1) sterge bitul 1 cel mai departe de x. (De ce
?). Folositi aceasta observatie pentru a scrie o versiune mai
rapida a lui bitcount.