IT情報@PRO人

C言語 練習問題 27

この記事は2016年8月25日に書かれたものです。内容が古い可能性がありますのでご注意ください。


C言語練習問題

C言語練習問題

環境について

C言語の練習問題です。

開発環境は以下の通り。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート)

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

コンパイラ:MinGW-w64 5.3.0 (posix, sjlj)

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

※※各問題へのリンク一覧を作成しました。

 

問題

次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。

 

プログラム(test27.c)

#include <stdio.h>
#include <stdbool.h>

int main(void){
  int i = 0;
  while(true){
    i++;
    printf("%d", i);

    if(i == 5){
      goto fin;
    }

  }
  return 0;
  fin:
}

 

問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。

A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。

なお、コマンドを入力する前はディレクトリ内のファイルはtest27.cのみであった。

gcc -o test27.exe test27.c

 

選択肢A,B,C

A.コンパイルに成功して( 空欄1 )が生成される。

B.( 空欄1 )ためコンパイルエラーが起こる。

C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。

 

 

問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。

 test27

 

選択肢A,B,C

A.ファイルが実行され( 空欄1 )と画面に表示される。

B.( 空欄1 )というファイルがないため実行できない。

C.コンパイルはされているが、( 空欄1 )という問題があるため実行結果は不定であり、実行は危険である。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

問1

B.( ラベルの直後に}で閉じている )ためコンパイルエラーが起こる。

※該当内容が指摘できていれば正解とする。ただし、returnの後にラベルがあるため、は不正解。解説参照。

 

問2

B.( test27 )というファイルがないため実行できない。

 

解説

問1,問2

前回まで同様goto文を利用している。今回はgoto文のラベルをプログラムの最後の行に貼っている。そのためコンパイルエラーになっているが、原因はラベルの直後が } になってしまっているためであって、return文の後ろにラベルがあるからではない

従って、以下のように書けば動く。

 

プログラム(test27_1.c)

#include <stdio.h>
#include <stdbool.h>

int main(void){
  int i = 0;
  while(true){
    i++;
    printf("%d", i);

    if(i == 5){
      goto fin;
    }

  }
  return 0;
  fin:; // ;を入れることで、ラベルの後に1行入っていると解釈される。
}

実行結果

>gcc test27_1.c -o test27_1.exe
>test27_1
12345

 

 

 

なお、goto文を使用したプログラムは他の構文を利用して書き直すことができることも多い。また、一般にgoto文を使用するとプログラムの流れが複雑になり可読性が著しく低下する。

そのため、コーディング規約でgoto文の使用が禁止されていることも多い。他の構文での書き換えが可能かどうか検討したうえで、どうしても使用する際はコーディング規約を確認した上で使用すること。

 

他の問題へのリンク一覧はこちら

 

  • このエントリーをはてなブックマークに追加

PAGE TOP