|
|
4. 条件分岐
条件分岐は言葉の通り「条件」によって「分岐」する制御文のひとつです。制御文はコントロール文とも呼ばれていて、プログラムはいくつかの制御文によってコントロールされています。条件分岐はその制御文1つになります。
C言語での条件分岐は、
if ( 条件式 ) {
... ( 実行式 )
}
という形で記述されるところから if 文とも呼ばれています。
条件式の部分では式の結果が true もしくは false として評価される式を書かなければなりません。true(真) と false(偽) から真偽値とも呼ばれています。「条件式」の部分が合っていれば trure、合っていなければ false になると考えて頂いて結構です。
if1.c
7行目で if ( a ) と変数 a を評価しています。1 と評価される式は true と評価されることになっています。結果として続く8行目で、
変数aは1でtrueです.
と表示されます。
それに対して12行目の if 文の条件式の変数aは 数値の0です。数値の0は false と評価されることに決まっています。結果として13行目以降は無視されてターミナル画面に表示されることはありません。
if2.c
それに対して if2.c では
変数aは1でtrueです.
変数bは0でfalseです.
と表示されます。
これは12行目の条件式で ( !a ) と変数aの前にNot演算子の ! を付けているからです。
このNot演算子は「何々でないことを true として評価する」という演算子です。この場合では「 falseである変数aを ! を付けることによって「 false であることが true である」という評価に変えています。このことによって13行目の「変数aは0でfalseです.」が表示されることになります。この ! 演算子はプログラミングの中では多用されます。ぜひ覚えておきましょう。
上記の2つはNot演算子の有無の問題はありますが、どちらも条件が合ったときにだけ if 文が実行されています。それに対して次のプログラムは、if 文に合致しない場合の処理も指定しています。
if3.c
7行目ではaは0なのでif文は実行さません。そして if 文の条件に合わなかった場合の処理を10行目のelse文で記述しています。この if3.c を実行すると
変数aは0であると思われます.
と表示されます。if 文の条件式の中では0はfalseと評価されますが、0以外であれば -1 でも 255 でも true と評価されます。5行目で a の値を色々と変えて試してみて下さい。
次に複数の条件によって分岐する if 文を示します
if4.c
10行目と13行目のように else if によって条件を増やしていくことができます。条件式の中で使われてる == は等号を表す演算子で == をはさんだ左辺と右辺の値が同じ場合は true と評価されて 値が違う場合は false と評価されます。なお「等号ではない」を意味する不等号は != と表します。この場合は左辺と右辺の値が違う場合に true と評価されて、左辺と右辺の値が同じ場合には false と評価されます。
5行目で変数aの値を色々と変えてみてどのように表示されるか試してみてください。
条件分岐の説明の最後として if4.c を少しインタラクティブに動かせるプログラムを変えてみましょう
今まで main( )関数は引数を void と指定して受け取る引数がないものとして取り扱ってきました。しかし本当はコマンドラインから起動する場合に受け取ることのできる2つの引数を持っています。
int main ( int argc, const char * argv[ ] ) {
...
}
ここでは一旦詳しい説明は省きますが、int型の argc という引数と、文字列の配列の argv という引数を受け取っています。argvのあとの [ ] は argv が配列であることを表しています。配列とは同じ型を複数集めたものです。int a [ 10 ] とすれば int 型の変数が10個続けて a という名前で確保されます。その10個のうちでどの変数を使うかは a [ 9 ] などと指定します。
配列の宣言は
int a [10]; // int型のデータ10個の配列
int a [ ]; // 個数は指定せずに取りあえず配列として宣言する
と記述しますが、実際にその配列の何番目のデータを参照したり変更したりするかを指定する場合は、配列内の順序は 0 番目から始まっていますので、例えば10番目のデータの場合は a [ 9 ] 。1番目のデータの場合は a [ 0 ] と指定します。
引数は受け取った関数内で直接変数として使えることを覚えていますか?
難しい話はこれくらいにしておいて早速コーディングしていきましょう。
if.c
ターミナルで learn-c フォルダにいることを確認してください。
gcc if.c -o if
でコンパイルします。
./if 2
と入力してリターンしてください。./if と 2 の間にはスペースが必要なことを忘れないでください。
変数aは2です.
と表示されると思います。
続けて ./if 1 や ./if 3 あるいは ./if 5 なども試してください。どのように表示されましたでしょうか?
もし、./if とだけ入力して数字を入力しない場合は
Bus error
と表示されると思います。
コード説明
2行目. #include < stdlib.h >
6行目で使っているatoi( )関数のためのヘッダファイルを読み込んでいます
6行目. int a = atoi(argv[ 1 ]);
int型の変数aを宣言して、atoi(argv[ 1 ])でその変数aに整数値を代入しています。
main( )関数の引数 argc はターミナルでプログラムを呼び出した場合に使われた文字列の数を整数として格納します。プログラム名も1つの文字列として計算されますので
./if 3
とプログラムを呼び出した場合はスペースで区切られた文字列の数は2つですので argc の値も2となります。
もうひとつの引数 argv はターミナルでプログラムを呼び出した場合に使われた文字列をスペースで区切られるごとに1つ1つの文字列として配列に格納されます。argvの1番目のargv[0]にはプログラム呼び出し名の ./if という文字列が入ります。argvの2番目の格納場所 argv[ 1 ]に指定した数字が文字として格納されます。なおこの argv配列は可変個の配列なのでいくつでもスペースで区切って文字列を格納していくことができます。
atoi( argv[ 1 ])
は、argv配列の2番目に格納されている文字列を整数に変換しています。そしてその整数が変数aに代入されます。
あとは if4.c プログラムと同じです。
switch 文
条件分岐に似たものに switch文と呼ばれるものがあります。if 文で使われる条件式の値は最終的に 真か偽に評価されるものなら何でも良いのですが、switch文での条件式には整数しか使えません。その整数の値によって実際に実行される実行式へと分岐していきます。
switch.c
ターミナルでlearn-c フォルダにいることを確認してください。そして次に、
gcc switch.c -o switch
とコンパイルしてください。
./switch 2
と入力してリターンキーを押してプログラムを実行してください。入力する数字は任意のもので結構です。プログラムの起動を指示する ./switch という文字列と数字の間には必ずスペースを空けてください。
6行目の switch ( 条件式 )の 条件式 のところに整数を表す定数、変数、あるいは整数を返す関数などを記述します。
そしてその整数の値によって case 数字 : の行へ制御が分岐していきます。
ここで注意しなければならないのは case 数字 :に制御は移動しますが、そこから次の break; 式に出会うまでか、あるいは終わりのブロック文の } に出会うまですべての式が実行されてしまうということです。つまり仮に7行目の case 1 : に分岐したとしても9行目・12行目・15行目の break; 式がなければ18行目の } までのすべての式が実行されてしまいます。break; 式を書き忘れないようい注意しましょう。
お疲れさまでした。これで第4回「条件分岐」は終りたいと思います。次回は繰り返し文( ループ文 )の予定です。
|
|
|