Tips

C言語練習問題

C言語練習問題

環境について

C言語の練習問題です。

開発環境は以下の通り。コンパイラ、OSともに64bit環境である。

PC:MacBook Pro 2011early 15inch

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

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

CPU:Core i7-2635QM 2.00GHz

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

 

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

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

問題

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

 

プログラム(test47.c)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void){
     
  int num = 1;
  int value;
  num == 0 ? (value = 0) : num == 1 ? (value = 1) : (value = 2) : (value = 3);
  printf("num   = %2d\n\r", num);
  printf("value = %2d\n\r", value);
 
  return 0;
}

 

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

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

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

1
gcc test47.c -o test47.exe -std=c99

 

選択肢A,B,C

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

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

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

 

 

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

1
test47

 

選択肢A,B,C

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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

問1

B.( 条件演算子の記述がおかしい )ためコンパイルエラーが起こる。

 

問2

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

 

解説
問1,問2

今回は条件演算子を利用している。C言語では条件演算子を入れ子構造にして利用することもできるが、今回はネストの条件式と処理の対応が正しくない。

ネストの構造がおかしいとコンパイルされなかったり、実行結果が予期していたものと異なることがある。今回はコンパイル段階でエラーとなる。

 

条件演算子をネストすると可読性が問題になることが多い。コーディング規約を確認してから使用すること。

 

参考:

C言語で条件演算子がネストされている場合、: と ? の数が一致していない場合はコンパイルエラーや予期しない挙動の原因となる。

挙動がおかしかったり、コンパイルに失敗する場合は : と ? の個数を確かめてみるのも良い。

※ただし、: と ? の数が一致していてもコンパイルエラーや実行時の予期せぬ挙動に繋がることがあるので要注意。

プログラム(test47_1.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main(void){
  
  int num = 1;
  int value;
  num == 0 ? (value = 0)
           : num == 1    ? (value = 1)
                         : (value = 2);
  // ? 2 個 : 2 個 なので ? と : の個数は一致している
  /*
  num == 0 ? (value = 0)
           : (num == 1) ? (value = 1)
                        : (value = 2)
                        : (value = 3);
  // ? 2 個 : 3 個 なので ? と : の個数が異なっているのでおかしい
  */
  /*
  num == 0 : (value = 1)
           ? (value = 2);
  // ? 2 個 : 2 個 だが、?と:の使い方が逆になっている
  */
  printf("num = %2d¥n¥r", num);
  printf("value = %2d¥n¥r", value);
  
  return 0;
}

実行結果

1
2
3
4
>gcc test47_1.c -o test47_1.exe -std=c99
>test47_1.exe
num = 1
value = 1

 

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

 

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search