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)
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
※※各問題へのリンク一覧を作成しました。
問題
コンピュータでは2の10乗 = 1024を約1000と判断して容量を計算していることがある。HDDやUSBメモリなどで表示されている容量と実際の容量が違って見えるのはこのためである。
次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。
プログラム(test34.c)
1 2 3 4 5 6 7 | #include <stdio.h> int main( void ){ int num = 2; printf ( "num ^ 2 = %d\n" , num ^ 2); return 0; } |
問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。
A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。
なお、コマンドを入力する前はディレクトリ内のファイルはtest34.cのみであった。
1 | gcc -o test34.exe test34.c |
選択肢A,B,C
A.コンパイルに成功して( 空欄1 )が生成される。
B.( 空欄1 )ためコンパイルエラーが起こる。
C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。
問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。
1 | test34 |
選択肢A,B,C
A.ファイルが実行され( 空欄1 )と画面に表示される。
B.( 空欄1 )というファイルがないため実行できない。
C.コンパイルはされているが、( 空欄1 )という問題があるため実行は危険である。
解答
問1
A.コンパイルに成功して( test34.exe )が生成される。
問2
A.ファイルが実行され( num ^ 2 = 0 )と画面に表示される。
解説
問1,問2
今回は^演算子を利用している。
コンピュータで^記号を利用する場合、その意味は大きく2種類に分かれることが多い。一つは累乗を示す演算子、もう一つは排他的論理和(XOR)を示す演算子である。
googleなどで2^2を検索すると、2の2乗の結果を表示してくれる。しかし、C言語の場合、^演算子は排他的論理和(XOR)を意味する。
排他的論理和とは、ビット演算の一種で、AとBの2つの値の各ビットを以下のルールに従って比較し、その結果のビット列を返す。
排他的論理和の計算結果
A | B | A ^ B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
他の論理演算子の演算結果は↓の表の通り。
論理演算のの計算結果
A | B | A ^ B (排他的論理和) | A | B (論理和) | A & B (論理積) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 1 |
表を見ると、論理和|と排他的論理和^の結果は似通っている。両方が1のときのみ結果が異なる。
以上のように、C言語では^演算子は排他的論理和を意味するため、累乗計算用の演算子としては用いることができない。
また、今回は2と2で排他的論理和を取っている。両方ともビットの並びが同じであるため、排他的論理和を取るとすべてのビットが0になる。
よって、num ^ 2 = 0と表示される。
もしC言語で累乗計算を行いたい場合、math.hヘッダのpow関数を利用したり、自作の関数を作成したりする必要がある。
pow関数の利用例
プログラム(test34_1.c)
1 2 3 4 5 6 7 8 | #include <stdio.h> #include <math.h> int main( void ){ int num = 2; printf ( "pow((double)num, 2.0) = %lf\n" , pow (( double )num, 2.0)); return 0; } |
実行結果
1 2 3 | > gcc test34_1.c -o test34_1.exe >test34_1.exe pow((double)num, 2.0) = 4.000000 |
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載