「C言語」の「switch」文と「while」文、「goto」文を学習してみる
前回学んだ「if・for文」以外に「switch・while文」も勉強していきたいと思います。
いろんな書き方があると混乱してしまいそうになるのですが、「知っておく」ということは大切なので、自分の「小量の記憶領域」になんとか詰め込んでいきたいと思います。
覚えることが多くて大変・・・というのが本音だったり。
では、今回は「switch・while文」について学んでいきたいと思います。
「switch」文を学んでみよう!
「if」文があれば、「switch」文は特にいらないんじゃと思っていたのですが、「数値の範囲」等では無く、「値」を判定対象にする場合は、「switch文」の方が使いやすいらしい。
ということで、「switch」文について書き方を見てみると、
switch(何かの式){ case 値: // 実行する処理 break; default: // caseの条件を満たさなかった場合の処理 break }
のように書く必要があります。
単に「整数」を比較するプログラムを書いてみると、
#include <stdio.h> int main(void) { int i = 3; switch(i){ case 3: printf("「i」の値は「%d」です。",i); break; default: printf("「i」の値はどの条件も満たせていません。"); break; } return 0; }
のようになります。
「i」の変数の値によって、表示結果が変化しますが、「case」の中にある「break」を忘れてしまうと、その下の「case」も実行されてしまいます。
となると、「if」文で書いてもいいのでは・・・
「if」文と「switch」文の比較
「if」文で書くと、
#include <stdio.h> int main(void) { int i = 3; if( i == 3){ printf("「i」の値は「%d」です。",i); } else { printf("「i」の値はどの条件も満たせていません。"); } return 0; }
のようになるので、「こっちのが良くない?」と正直思ってしまいます。
「switch」文の使いどころがよくわからない・・・
いろいろと調べていたら「複数のelse ifがあると書くのが面倒」という意見があったり、「switch」文の方がプログラムが読みやすいという意見もあったり。
書く人の「感じ方」でも書き方は変わってきそうですね。
これが「正解」というものが無さそうなので、自分で書いて、どの書き方が良いのかを考えていく必要がありそうです。
「while」文を学んでみる
「for」文と同様に「while」文を使うことでも、「繰り返し処理」を作ることができます。
「while」文の書式は、
int 繰り返しをカウントする変数 while(繰り返し条件){ // 繰り返し実行する処理 繰り返しカウントする変数を増減する処理 }
となりますが、プログラムにしてみると、
#include <stdio.h> int main(void) { int i = 0; while(i<10){ printf("i=%d\n",i); i++; } return 0; }
のようになります。
このプログラムを実行すると、
i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9
のように表示されます。
「while」文は、「for」文の式の位置が変わっているだけなので、どっち使ってもいいのかな。
もう一つ「while」文には、「do while」文というものもあり、
#include <stdio.h> int main(void) { int i = 0; do { printf("i=%d\n", i); i++; } while(i < 10); return 0; }
のように書くことができます。
「while」文と「do while」文の違いは、繰り返し処理を行う前に「条件判定」を行うか、繰り返し処理を行った後に「条件判定」を行うかの違いがあります。
「do while」は、繰り返し処理を行った後に「条件判定」を行うため、必ず1回は「繰り返し処理」が行われるようになっているんですね。
「while」文と「switch」文を組み合わせてみる
「if」文と「while」文を組み合わせたように、「while」文と「switch」文を組み合わせてみたいと思います。
#include <stdio.h> int main(void) { int i = 1; while( i < 100 ){ int j = i%7; switch(j){ case 0: printf("「i」の値は「%d」です。\n",i); break; default: break; } i++; } return 0; }
1から100までの間で、「7の倍数」であれば、画面に出力するというシンプルなプログラムです。
実行してみると・・・
「i」の値は「7」です。 「i」の値は「14」です。 「i」の値は「21」です。 「i」の値は「28」です。 「i」の値は「35」です。 「i」の値は「42」です。 「i」の値は「49」です。 「i」の値は「56」です。 「i」の値は「63」です。 「i」の値は「70」です。 「i」の値は「77」です。 「i」の値は「84」です。 「i」の値は「91」です。 「i」の値は「98」です。
のようになります。
いろいろな書き方ができるということは、ケースに応じて使い分けることができる利便性もありますが、「人によって書き方が異なる」といった、「プログラムの書き方を統一することが難しくなる」という側面もあります。
初心者はいろいろなプログラムの書き方があるとどれを使えばいいのか混乱してしまいます・・・
「goto」文と「ラベル」
「使わない方がいいよ」と学ぶ前に指摘されたのが「goto」文と「ラベル」なのですが、どんなものなのかを知っておくことが大切だと思うので、学んでいきたいと思います。
まず、「goto」文は、「指定したラベル」に処理を移動するという役割があります。
「処理の移動」がよくわからなかったのですが、「goto」文の位置から「ラベル」というものが書かれた位置に処理が移るということらしい・・・
さっそくプログラムを書いてみると、
#includeint main(void) { int i = 1; while( i < 100 ){ if( i == 10 ){ goto sample_label; } printf("i=%d\n", i); i++; } sample_label: printf("処理が終わりました。"); return 0; }
となります。
goto ラベル名;
と書くと、
ラベル名: 実行する処理
の位置に処理が移動します。
なんで使ってはいけないのかがわからなかったので、聞いてみたら、「処理の流れがあっちこっちに移動するので、処理の流れがわかりづらくなる」からみたいです。
そんなに複雑なプログラムを書いたことが無いので、実感が全然湧かないけど、「規模の大きいプログラム」だと確かに処理の流れがわからなくなりそう。
今後も、必要なことも必要ではないこともいろいろと勉強していきたいと思います。