Evaluacija izraza u C petlji

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.

evo jedan los primjer, ali nadam se da ces pomocu njega shvatit sta si pitao:

#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;
}

uglavnom: sa “=” dodjeljujes neku vrijednost necemu, a sa “==” poredis vrijednosti.

pogledaj ovaj primjer:

#include <stdio.h>

int main(void)
{
        int i = 1;
        if(i == 1)
        {
                printf("prvi if, i=%d\n", i);
        }

        if(i = 2)
        {
                printf("drugi if, i=%d\n", i);
        }

        if(i = 0)
        {
                printf("treci if, i=%d\n", i);
        }

        return 0;
}

Da uprostim:

Sto se tice dodjele, samo dodaj zagrade:

Ovaj dio sa == true mozes izostavit jer se podrazumijeva.

Jasno;

Prioritet operacija nisam baš najbolje shvatao al sad je OK.

Hvala.

[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 :slight_smile: 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 :slight_smile:

Dopuna:

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)

Zahvaljujući tome moguće je programirati sljedeća čudo (while petlja bez tijela, nesigurna string copy operacija):

while( *dest++ = *src++ );

Tehnički gledano, da.

I ovo je valjan kod:


    for( int i = 0; i < n, i++)
        ;  // faktički bez naredbe u tijelu, sav posao se odrati u "glavi"

Btw - admine može li se ugraditi nekakav syntax higlighter pa da malo uljepšamo kod ?

http://alexgorbatchev.com/SyntaxHighlighter/

Hvala.

#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]