C言語の基礎

unsigned int i;
for (i = 3; i >= 0; i--)
    printf("%u ", i);

unsigned int は32ビットとする。上のコードを実行したときの動作として、正しいものはどれか。

  1. A3 2 1 0 と表示して終わる
  2. B3 2 1 と表示して終わる
  3. 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になり、条件は常に真です。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. 「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。
  2. && と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。
  3. break のない case を含む上の switch 文を実行したときの出力として、正しいものはどれか。
  4. 上のプログラムを実行したときの出力として、正しいものはどれか。
  5. 上の関数 f を3回続けて呼び出したとき、3回目の戻り値として正しいものはどれか。