[quote=carousel]Ne razumijem baš ovaj C idiom koji često srećem.
A to je da se izraz evaluira u uslovu petlje na slijedeći način:
while ( promjenjiva = neka_funkcija_recimo()){
uradi nešto
}
Buni me ovaj operator dodjele. Ja sam navikao da se na ovom mjestu obično nalazi == ili slično.[/quote]
Hehe, zanimljiv odabir idioma Iako je često uzrok mnogo programskih grešaka, mislim da je veoma koristan.
Osnovna ideja jeste da je u C-u skoro sve izraz (expression), tako da izraz A = B i “odradi” dodjelu vrijednosti, i vraća finalnu vrijednost A nakon dodjele.
Zahvaljujući tome moguće je programirati sljedeća čudo (while petlja bez tijela, nesigurna string copy operacija):
while( *dest++ = *src++ );
Još jedan primjer: Zamisli sljedeće, imaš funkciju koja čita datoteku, liniju po liniju (ima interni brojač) i vraća je u obliku stringa, te NULL za kraj:
while (line = read_line(f))
{
printf("%s\n", line);
}
Ne moraš provjeravati izlazni uslov, jer while petlja završi kada je line == NULL
Da bi smanjio mogućnost grešaka, pored malo agresivnijih parametara za kompajler, kompajlera sa boljom dijagnostikom ili lint-a, možeš koristiti sljedeći idiom za provjere uslova u petljama:
while (SOME_CONST == some_var)
{
}
Gdje je se neće moći desiti da slučajno ostane “SOME_CONST = some_var” zato što će to uhvatiti kompajler kao grešku (dodjela vrijednosti konstanti ili literalu)
#include <stdio.h>
int counter = 255;
int neka_funkcija_recimo()
{
return counter--;
}
int main(void)
{
int promjenjiva;
while(promjenjiva = neka_funkcija_recimo())
{
printf("vrijednost countera je: %d\n", promjenjiva);
}
printf("\nkraj programa\n");
return 0;
}
vedran@tablet:/tmp$ gcc -Wall maher.c
maher.c: In function ‘main’:
maher.c:13:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses]