When I execute the following loop :

 unsigned m;
 for( m = 10; m >= 0; --m ){

the loop doesn't stop at m==0, it keeps executing interminably, so I thought that reason was that an unsigned cannot be compared to 0. But when I did the following test

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

I got this result:

m is positive 

which means that the unsigned variable m was successfully compared to 0.
Why doesn't the comparison of m to 0 work in the for loop and works fine elsewhere?


You should compile with all warnings enabled.

A test like m >= 0 is always true if m is unsigned; so

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

can be optimized as

printf("m is positive\n");

A recent version of GCC, invoked as gcc -Wall (or gcc -Wall -O1) would have warned you.

And a test like m >0 is the same as m != 0 (or just m)

And your for ( m = 10; m >= 0; --m ) loop is understood as for(m=10; TRUE; --m) so loops indefinitely. Mabye you wanted for (m=10; (int)m>=0; m--) , then the test would fail when m becomes large enough to not fit in an int (without overflow to negative int). But such a (int)m>=0 is ugly and unreadable, so avoid it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.