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文の使用が禁止されていることも多い。他の構文での書き換えが可能かどうか検討したうえで、どうしても使用する際はコーディング規約を確認した上で使用すること。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載