Capitolul 2.8. Operatori de incrementare si decrementare
:: Programare :: C & C++ :: Capitolul 2
Pagina 1 din 1
Capitolul 2.8. Operatori de incrementare si decrementare
Limbajul C ofera doi operatori neuzuali pentru incrementarea si decrementarea variabilelor. Operatorul de incrementare ++ aduna 1 la operandul sau; operatorul de decrementare -- scade 1. Am folosit frecvent ++ pentru a incrementa variabilele, de exemplu:
if (c == '\n')
++nl;
Aspectul neobisnuit al lui ++ si al lui -- este acela ca ei pot fi folositi atit ca operatori prefix (inaintea variabilei, ca in ++n) cit si ca operatori sufix (dupa variabila, ca in n++).
In ambele cazuri, efectul este incrementarea lui n. Dar expresia ++n il incrementeaza pe n inainte de a-i folosi valoarea, in timp ce expresia n++, il incrementeaza pe n dupa ce a fost folosita valoarea lui. Aceasta inseamna ca intr-un context in care valoarea este folosita, si nu numai efectul, ++n si n++ sint diferiti. Daca n este 5, atunci:
x = n++;
il face pe x egal cu 5, dar
x = ++n;
il face pe x egal cu 6. In ambele cazuri, n devine 6.
Operatorii de incrementare si decrementare se pot aplica numai variabilelor. O expresie de tipul x = (i+j)++ este ilegala.
Intr-un context in care valoarea nu este folosita, ci numai efectul de incrementare, ca in
if (c == '\n')
nl++;
alegeti modul prefix sau sufix dupa gustul dumneavoastra. Dar exista totusi situatii in care unul sau altul este apelat din adins. De exemplu, sa consideram functia squeeze(s,c) care elimina toate aparitiile lui c din sirul s:
squeeze (s,c) /* sterge toate aparitiile lui c din s */
char s[];
int c;
{
int i, j;
for (i = j = 0; s[i] != '\0'; i++)
if (s[i] != c)
s[j++] = s[i];
s[j] = '\0';
}
De fiecare data cind apare un caracter non-c el este copiat in pozitia j curenta si numai dupa aceea j este incrementat pentru a fi gata pentru urmatorul caracter. Aceasta constructie este echivalenta cu urmatoarea:
if (s[i] != c)
{
s[j] = s[i];
j++;
}
Un alt exemplu de constructie similara este luata din functia getline pe care am scris-o in Capitolul 1, in care putem inlocui
if (c == '\n' {
s[i]=c;
++i;
}
cu mult mai compacta constructie:
if (c == '\n')
s[i++] = c;
Ca un al treilea exemplu functia strcat(s,t) care concateneaza sirul t la sfirsitul sirului s. strcat presupune ca exista suficient spatiu in s pentru a pastra combinatia.
strcat (s,t) /* concateneaza pe t la sfirsitul lui s */
char s[], t[]; /* s trebuie sa fie suficient de mare */
{
int i, j;
i = j = 0;
while (s[i] != '\0') /* gaseste sfirsitul lui s */
i++;
while ((s[i++] = t[j++]) != '\0') /* copiaza pe t */
;
}
Cum fiecare caracter este copiat din t in s, se aplica postfixul ++ atit lui i cit si lui j pentru a fi siguri ca sint pe pozitie pentru urmatorul pas din bucla.
Exercitiul 2.3. Scrieti o alta versiune a lui squeeze(s1, s2) care sterge fiecare caracter din s1 care se potriveste cu vreun caracter din s2.
Exercitiul 2.4. Scrieti functia any(s1, s2) care returneaza prima locatie din sirul s1 in care apare vreun c acter din sirul s2, sau pe -1 daca s1 nu contine nici un caracter din s2.
if (c == '\n')
++nl;
Aspectul neobisnuit al lui ++ si al lui -- este acela ca ei pot fi folositi atit ca operatori prefix (inaintea variabilei, ca in ++n) cit si ca operatori sufix (dupa variabila, ca in n++).
In ambele cazuri, efectul este incrementarea lui n. Dar expresia ++n il incrementeaza pe n inainte de a-i folosi valoarea, in timp ce expresia n++, il incrementeaza pe n dupa ce a fost folosita valoarea lui. Aceasta inseamna ca intr-un context in care valoarea este folosita, si nu numai efectul, ++n si n++ sint diferiti. Daca n este 5, atunci:
x = n++;
il face pe x egal cu 5, dar
x = ++n;
il face pe x egal cu 6. In ambele cazuri, n devine 6.
Operatorii de incrementare si decrementare se pot aplica numai variabilelor. O expresie de tipul x = (i+j)++ este ilegala.
Intr-un context in care valoarea nu este folosita, ci numai efectul de incrementare, ca in
if (c == '\n')
nl++;
alegeti modul prefix sau sufix dupa gustul dumneavoastra. Dar exista totusi situatii in care unul sau altul este apelat din adins. De exemplu, sa consideram functia squeeze(s,c) care elimina toate aparitiile lui c din sirul s:
squeeze (s,c) /* sterge toate aparitiile lui c din s */
char s[];
int c;
{
int i, j;
for (i = j = 0; s[i] != '\0'; i++)
if (s[i] != c)
s[j++] = s[i];
s[j] = '\0';
}
De fiecare data cind apare un caracter non-c el este copiat in pozitia j curenta si numai dupa aceea j este incrementat pentru a fi gata pentru urmatorul caracter. Aceasta constructie este echivalenta cu urmatoarea:
if (s[i] != c)
{
s[j] = s[i];
j++;
}
Un alt exemplu de constructie similara este luata din functia getline pe care am scris-o in Capitolul 1, in care putem inlocui
if (c == '\n' {
s[i]=c;
++i;
}
cu mult mai compacta constructie:
if (c == '\n')
s[i++] = c;
Ca un al treilea exemplu functia strcat(s,t) care concateneaza sirul t la sfirsitul sirului s. strcat presupune ca exista suficient spatiu in s pentru a pastra combinatia.
strcat (s,t) /* concateneaza pe t la sfirsitul lui s */
char s[], t[]; /* s trebuie sa fie suficient de mare */
{
int i, j;
i = j = 0;
while (s[i] != '\0') /* gaseste sfirsitul lui s */
i++;
while ((s[i++] = t[j++]) != '\0') /* copiaza pe t */
;
}
Cum fiecare caracter este copiat din t in s, se aplica postfixul ++ atit lui i cit si lui j pentru a fi siguri ca sint pe pozitie pentru urmatorul pas din bucla.
Exercitiul 2.3. Scrieti o alta versiune a lui squeeze(s1, s2) care sterge fiecare caracter din s1 care se potriveste cu vreun caracter din s2.
Exercitiul 2.4. Scrieti functia any(s1, s2) care returneaza prima locatie din sirul s1 in care apare vreun c acter din sirul s2, sau pe -1 daca s1 nu contine nici un caracter din s2.
Subiecte similare
» Capitolul 2.5. Operatori Aritmetici
» Capitolul 2.6. Operatori relationali si logici
» Capitolul 2.9. Operatori logici pe biti
» Capitolul 2.10.Operatori si expresii de asignare
» Capitolul 2. TIPURI, OPERATORI SI EXPRESII
» Capitolul 2.6. Operatori relationali si logici
» Capitolul 2.9. Operatori logici pe biti
» Capitolul 2.10.Operatori si expresii de asignare
» Capitolul 2. TIPURI, OPERATORI SI EXPRESII
:: Programare :: C & C++ :: Capitolul 2
Pagina 1 din 1
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum
|
|