Deo zbornika Uvod u programiranje kroz C
Relacijski i logički operatori
Relacijski operatori su >, >=, <, <=. Svi imaju isti prioritet. Odmah ispod njih po prioritetu su operatori jednakosti == i !=.
Relacijski operatori imaju niži prioritet od aritmetičkih operatora, pa izraz i<lim-1 se tretira kao i i<(lim-1), što je prirodno.
Logički operatori && i ||
Mnogo zanimljiviji su logički operatori && i ||. Izrazi povezani ovim operatorima računaju se slijeva udesno, računanje se prekida čim se ustanovi točnost ili netočnost rezultata. Mnogi C programi napisani su s jakim osloncem u ovim pravilima. Npr. evo petlje ulazne funkcije getline:
for(i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i]=c;
Prije čitanja novog znaka treba obavezno provjeriti ima li za njega mjesta u znakovnom nizu s, tako da se najprije obavi provjera i<lim-1. Ako je odgovor negativan, nema smisla dalje čitati znakove. Bilo bi jednako tako pogrešno ako bi se prije pozivanja funkcije getchar, obavila provjera c!=EOF, jer pozivanje i dodjela vrijednosti moraju izvršiti prije negoli se testira znak pohranjen u c.
Prioritet && je viši od ||, a oba su operatora nižeg ranga od relacijskih i operatora jednakosti, pa zato u slijedećem izrazu nije potrebno dodavati zagrade:
i < lim-1 && (c=getchar()) != '\n' && c != EOF
No, kako je prioritet != viši od operatora dodjele, zagrade su obavezne u izrazu što slijedi:
(c=getchar()) != '\n'
da bi se osigurala dodjela varijabli c, a potom i usporedba sa ‘\n’.
Po definiciji, brojčana vrijednost relacijskog ili logičkog izraza je 1 ako je relacija točna, a 0 ako je netočna.
Negacija
Operator unarne negacije ! pretvara 1 u 0 i obratno. Najčešća je upotreba ovog operatora u izrazima poput:
if(!valid)
umjesto
if(valid==0)
Teško je kazati koja je forma bolja. Konstrukcije kao !valid lijepo izgledaju (“ako nije valid”), dok bi zahtjevnije konstrukcije bile i teže za čitanje.
Vježba 2-2.
Napišite petlju ekvivalentnu gore napisanoj for petlji bez upotrebe && ili ||.
Izvor: Brian Kernighan i Dennis Ritchie, Programski jezik C