confronto di una variabile senza segno a 0

0

Quando eseguo il seguente ciclo:

 unsigned m;
 for( m = 10; m >= 0; --m ){
        printf("%d\n",m);
    }

il ciclo non si ferma a m == 0, continua a essere eseguito in modo interminabile, quindi ho pensato che il motivo per cui un non firmato non può essere paragonato a 0. Ma quando ho fatto il seguente test

unsigned m=9;
if(m >= 0)
    printf("m is positive\n");
else
    printf("m is negative\n");

Ho ottenuto questo risultato:

m is positive 

che significa che la variabile unsigned m è stata confrontata con successo con 0.
Perché il confronto di m su 0 non funziona nel ciclo for e funziona bene altrove?

    
posta user2651062 17.08.2014 - 20:11
fonte

1 risposta

3

Devi compilare con tutti gli avvisi abilitati.

Un test come m >= 0 è sempre vero se m è unsigned ; così

if(m >= 0)
  printf("m is positive\n");
else
  printf("m is negative\n");

può essere ottimizzato come

printf("m is positive\n");

Una versione recente di GCC , invocata come gcc -Wall (o gcc -Wall -O1 ) ti avrebbe avvisato.

E un test come m >0 è uguale a m != 0 (o solo m )

E il tuo ciclo for ( m = 10; m >= 0; --m ) è inteso come for(m=10; TRUE; --m) , quindi i loop sono indefiniti. Mabye volevi for (m=10; (int)m>=0; m--) , quindi il test fallirebbe quando m diventa abbastanza grande da non rientrare in un int (senza overflow a% int ). Ma tale (int)m>=0 è brutto e illeggibile, quindi evitalo.

    
risposta data 17.08.2014 - 20:24
fonte

Leggi altre domande sui tag