Deo zbornika Uvod u programiranje kroz C
Operatori uvećavanja i umanjivanja (inkrement i dekrement)
C je uveo dva neuobičajena operatora za uvećavanje i smanjivanje varijabli za jedan. Operator inkrementiranja ++
dodaje 1 svom operandu, dok operator dekrementiranja oduzima 1.
Često ćemo koristiti ++
za uvećavanje varijabli kao u:
if(c=='\n')
++nl;
Neobičnost ovih operatora jest da se mogu koristiti kao prefiks operatori (++n
) ili kao sufiks (n++
). Učinak je u oba slučaja jednak - varijabla se uveća za jedan. Međutim, izraz ++n
uvećava vrijednost n
prije negoli njegova vrijednost bude upotrijebljena (pretpostavimo da je ++n
dio neke relacije), a n++
nakon korištenja. To zapravo znači da ta dva izraza nikako ne možemo smatrati ekvivalentnima osim ako nisu izdvojene programske linije. Neka je n
5, tada:
x=n++;
postavlja x
na 5, dok
x=++n;
postavlja x
na 6. U oba slučaja, n
postaje 6. Operatori uvećavanja i umanjivanja pridjeljuju se samo varijablama; izraz kakav je (i+j)++
jest nekorektan. U slučaju kad se određena vrijednost ne koristi, već je bitno samo uvećanje kao:
if(c=='\n')
nl++;
prefiks i sufiks oblik izraza postaju ekvivalentni. Ima situacija, međutim, kad se jedan ili drugi ciljano zovu.
Primjer: Funkcija squeeze
Primjerom kazano, osmotrimo funkciju squeeze(s, c)
koja uklanja znak c
kad god se pojavi u nizu s
:
/* squeeze: brisanje svih c iz s */
void squeeze(chars[], int c){
int i,j;
for(i=j=0; s[i]!='\0'; i++)
if(s[i]!=c)
s[j++]=s[i];
s[j]='\0';
}
Za svaki znak različit od c
, operator uvećava j
da bi prihvatio slijedeći znak. Ovo je potpuno ekvivalentno s:
if(s[i]!=c){
s[j]=s[i];
j++;
}
Primjer: Funkcija getline
Slijedeći primjer je slična konstrukcija iz getline
funkcije o kojoj je već bilo riječi, gdje dio programa:
if(c=='\n'){
s[i]=c;
++i;
}
može biti napisan i kao:
if(c=='\n')
s[i++]=c;
Primjer: Funkcija strcat
Kao treći primjer, prispodobimo standardnu funkciju strcat(s, t)
, koja spaja kraj znakovnog niza s
s početkom niza t
. Funkcija strcat
pretpostavlja da ima dovoljno mjesta u s
da smjesti oba niza. Kako smo već napisali, strcat
ne vraća nikakvu vrijednost osim pokazivača (pointera) na rezultirajući znakovni niz.
/* strcat: povezivanje znakovnih nizova */
void strcat(char s[], char t[]){
int i, j;
i=j=0;
while(s[i]!='\0') /* Gdje je kraj niza s ? */
i++;
while((s[i++]=t[j++])!='\0') /* prebaci t */
;
}
Kada se znakovi prebacuju iz t
u s
, sufiks ++
pridružuje se i varijabli i
i varijabli j
, kako bi smo bili sigurni da su u poziciji za naredni prolaz kroz petlju.
Vježba 2-4.
Napisati alternativnu inačicu funkcije squeeze(s1, s2)
koja briše svaki znak u s1
koji postoji u s2
.
Vježba 2-5.
Napisati funkciju any(s1, s2)
koja vraća prvo mjesto u nizu s1
gdje se nalazi bilo koji znak iz niza s2
ili -1 ako niz s1
nema nijednog znaka iz niza s2
(funkcija strcpbrk
iz standardne biblioteke radi isto, osim što vraća pokazivač na mjesto).
Izvor: Brian Kernighan i Dennis Ritchie, Programski jezik C