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)
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
※※各問題へのリンク一覧を作成しました。
問題
次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。
プログラム(test26.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main( void ){ int i = 0; a: int num = 0; i++; num++; if (i < 10){ goto a; } printf ( "%d " , num); return 0; } |
問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。
A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。
なお、コマンドを入力する前はディレクトリ内のファイルはtest26.cのみであった。
1 | gcc -o test26.exe test26.c |
選択肢A,B,C
A.コンパイルに成功して( 空欄1 )が生成される。
B.( 空欄1 )ためコンパイルエラーが起こる。
C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。
問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。
1 | test26 |
選択肢A,B,C
A.ファイルが実行され( 空欄1 )と画面に表示される。
B.( 空欄1 )というファイルがないため実行できない。
C.コンパイルはされているが、( 空欄1 )という問題があるため実行結果は不定であり、実行は危険である。
解答
問1
B.( 変数(num)の定義の前でラベルを貼っている )ためコンパイルエラーが起こる。
※該当内容が指摘できていれば正解とする。解説参照。
問2
B.( test26 )というファイルがないため実行できない。
解説
問1,問2
前回同様goto文を利用している。今回は特別なことをしているようには見えない。しかし、goto文のラベルは、変数の定義の前に貼るとエラーが発生する。
今回は変数numの定義の前にラベルを貼っているため、該当箇所でラベルaが定義されていないというエラーが発生する。
今回のプログラムは以下のようにすれば実行できる。
プログラム(test26_1.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main( void ){ int i = 0; //a: int num = 0; a: i++; num++; if (i < 10){ goto a; } printf ( "%d " , num); return 0; } |
実行結果
1 2 3 | > gcc test26_1.c -o test26_1.exe >test26_1 10 |
また、今回の環境では下記のように記述しても動く。ただし、test26_1.cとは挙動が異なる。冒頭でも触れたが、実行する場合は自己責任で実行すること。
プログラム(test26_2.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main( void ){ int i = 0; a: //次の行で変数の定義以外の処理をしているためコンパイルできる。 i++; int num = 0; //a: //i++; num++; if (i < 10){ goto a; } printf ( "%d " , num); return 0; } |
実行結果
1 2 3 | > gcc test26_2.c -o test26_2.exe >test26_2 1 |
なお、goto文を使用したプログラムは他の構文を利用して書き直すことができることも多い。また、一般にgoto文を使用するとプログラムの流れが複雑になり可読性が著しく低下する。
そのため、コーディング規約でgoto文の使用が禁止されていることも多い。他の構文での書き換えが可能かどうか検討したうえで、どうしても使用する際はコーディング規約を確認した上で使用すること。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載