C言語の基礎
unsigned int i;
for (i = 3; i >= 0; i--)
printf("%u ", i);unsigned int は32ビットとする。上のコードを実行したときの動作として、正しいものはどれか。
- A3 2 1 0 と表示して終わる
- B3 2 1 と表示して終わる
- C3 2 1 0 と表示した後も終わらず、4294967295 から値を減らしながら表示し続ける
答えと解説を見る
正解:C. 3 2 1 0 と表示した後も終わらず、4294967295 から値を減らしながら表示し続ける
i は符号なしなので負の値になることはなく、条件 i >= 0 は常に真です。i が0のときに i-- を行うと 2³² − 1 = 4294967295 に戻り、ループは終わらずに 4294967294、4294967293 と表示し続けます。0まで数え下げたい場合は、int を使うか、for (i = 4; i-- > 0; ) のように書き方を変えます。gcc では -Wextra を付けると、この比較が常に真であるという警告が出ます。
- A. i が0のときも i >= 0 は真なので、ループは0で終わりません。
- B. i が0のときも条件は真なので、0も表示され、その後も続きます。
- C. 正しい。符号なしの i は0から1減らすと4294967295になり、条件は常に真です。