Deo zbornika Uvod u svet programiranja

Operatori uvećavanja i umanjivanja (inkrement i dekrement)

Email Twitter LinkedIn Facebook Google

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