こんちゃっす、ダイブツです。
今回はC言語で主要な内容となるif文について学習していきましょう。
if文と繰り返し文が使えるようになれば、プログラムの7割はできるようになったといっても過言ではありません。
僕は派遣エンジニア歴8年ですが、本当にめちゃくちゃ使っています。
それだけ重要な内容なので、しっかり身に付けましょう。
それじゃあ、if文の条件式について説明していきますね。
目次
if文で判断できる7つの条件
if文で判断できる条件は大きく分けると2つあります。
それは
・等しいか、等しくないか
・大きいか、小さいか
の2つです。
この2つをさらに細かく分けてif文での書き方を表にしてみました。
自分で使いたい条件が出てきた時に参考にしてください。
判断できる内容 | if文での書き方 |
---|---|
= | == |
≠ | != |
< | < |
≦ | <= |
> | > |
≧ | >= |
0 or 0以外 | 変数のみ書く |
この表を最後まで見て、「あれ?」って思いませんでしたか?
そうなんです、C言語では2つの数字が等しいとか大小比べる以外に、数字の値だけで判断できるんです。
プログラミング関係でよく聞くTRUE(真) or FALSE(偽)のようなものです。
C言語で言うと、TRUE(真)が0以外の値、FALSE(偽)が0の値と判断することになりますね。
あと、実は条件って1つだけで使う訳じゃなくて、複数の条件を組み合わせて使うこともあります。
例えば、「緑LEDが点灯中と赤LEDが点灯中」のことを条件にするなら、「緑LEDが点灯中」と「赤LEDが点灯中」の2つが条件になりますよね?
こんな風に条件を組み合わせて使う時は次の表のような書き方をします。
この条件の組合せ例については、また下で説明しますね。
組合せ可能な条件 | if文での書き方 |
---|---|
条件1かつ条件2 | && |
条件1もしくは条件2 | || |
実はこのif文で判断できる条件というのは、while文で使っている条件と全く同じです。
なので、while文もある意味if文の一種と言っても過言ではないんですわ。
while(1)で無限ループになるのは、条件式がずっとTRUEのまま変わらないからなんですね。
この記事でif文を身に付けることでwhile文のスキルも向上するという、まさに一石二鳥な内容!
絶対におさえておきたいif文の書き方4パターン
上で説明したif文で判断できる条件を使ってif文を書いていくんですが、if文と言っても色々な書き方があります。
これだけ覚えておけば大丈夫!というパターンを4つ厳選したので、このif文は書けるようになりましょう。
というかこのif文を使う機会はクソほど出てくるので、心配しなくても自然と使えるようになりますよw
パターン1:ifの条件が1つだけの場合
if(条件){
処理
}
パターン2:2つの条件を組み合わせたifが1つだけの場合
if(条件1 && 条件2){
処理
}
パターン3:ifの条件が1つだけ+それ以外を処理する場合
if(条件){
処理
}else{
処理
}
パターン4:ifの条件が2つ+それ以外を処理する場合
if(条件1){
処理
}else if(条件2){
処理
}else{
処理
}
プログラミングの幅が広がったことが分かるif文の例
if文の書き方が何となく分かった所で、実際にif文を使ったらどんなプログラムが作れるか例を作りました。
それがこれです。
これは、500ms経過したら緑LEDを点灯、さらに500ms経過したら緑LEDを消灯というプログラムにしています。
このプログラムの内容は↓の通りですね。
#include "r_cg_userdefine.h"
#include "./library/time.h" //wait_1ms()を使えるようにインクルード
void main_study(void)
{
int iLedOnCycleMs = 0; //経過時間カウント用変数
int iLedOnOff; //LEDの点灯消灯設定用変数
while(1){
//経過時間が0~500msの間はLEDを消灯
if(iLedOnCycleMs <= 500){
iLedOnOff = 0; // LEDを消灯
}
//経過時間が501ms以上の間はLEDを点灯
if(iLedOnCycleMs > 500){
iLedOnOff = 1; // LEDを点灯
}
P_GREEN_LED = iLedOnOff; // 緑色LEDを点灯 or 消灯
wait_1ms(); //1ms待つ
//経過時間が1000ms以上になったらカウンタをクリア
//それ以外の時は経過時間をカウントする
if(iLedOnCycleMs >= 1000){
iLedOnCycleMs = 0;
}else{
iLedOnCycleMs++;
}
}
}
経過時間をif文で確認して、LEDを点滅させる処理を作っています。
20行程度のプログラムで、LEDを点滅させる処理ができるんですね。
このプログラムだとif文のありがたみはあまり感じないかもしれませんが、これが青色LEDと赤色LEDも違うタイミングで点滅させて・・・となってくると、if文を使った方が格段に単純にプログラムを書けます。
プログラムはより単純に書いた方が、他人にとって読みやすくなるので、if文を使って単純にプログラムを書くことを意識しましょうね。
この例ではif文でLEDの点滅ができるようになりましたが、LEDの点滅以外にも不規則な動きを表現するのに必要だったり、色んなタイミングで必須になってきます。
このプログラムを自由自在に変更できるのが、if文の凄さなんです。
switchとは「どちらにしようかな」のこと
条件を判断できる文として、if文の他にswitchというものがあります。
このswitch文はイメージでいうと、まさに「どーちーらーにーしーよーうーかーな」です。(地域によって言い方が違うらしいですが、伝わるかな?)
複数ある内の値から、「これっ!」と狙い撃ちして条件を見極めていく書き方なんですね。
この言い方だけだと伝わりにくいと思うので、実際にswitchの書き方を説明していきます。
switchの書き方1+1パターン
switchでは、1つの変数が何の値か?ということを判断して処理していきます。
この「何の値か?」を判断するのがcaseですね。
このcaseで、変数が1の時はこの処理、2の時はこの処理、といった具合に分けていきます。
それじゃあ具体的な書き方を見ていきましょう。
基本的な書き方
switch( 変数名 ){
case 値1:
処理
break;
case 値2:
処理
break;
default:
処理
break;
}
このdefaultというのが、if文でいうelseと同じ意味になります。
caseに書かれていない値だったら、defaultの処理をするということですね。
そして、実はcaseには値ではなく、計算式を書くことも可能ではあります。
可能ではあるんですが、一般的にはcaseには値だけで条件を指定するので、caseは値のみ書くと覚えておいた方がいいです。
計算式もできるということだけ参考にしてくださいね。
少し変則的だけど、よく使う書き方
switch( 変数名 ){
case 値1:
case 値2:
case 値3:
処理
break;
default:
処理
break;
}
switchでは処理の後にbreakを書かなくちゃいけないんですが、それぞれのcaseに同じ処理とbreakを何回も書くのは嫌ですよね。
なので、色んなcaseの処理をまとめたい時に↑のように書きます。
こうすることでどの値の時に何の処理を行うかも整理できて、他人が見ても分かりやすいプログラムになりますよ。
switchを一発で理解できる例
それじゃあ実際にswitchを使った例を見ていきましょう。
これが例となるプログラムを実行した結果です。
このプログラムは、if文の例で使っていた緑LED点滅の処理を流用しています。
ただ、今回点滅させるLEDは緑、青、赤の3種類にしているんですね。
で、ここからがswitchの見所!
点めるさせるLEDを緑、青、赤の順番に変えています。
この点滅するLEDを指定していくのが、まさにswitch!という処理ですね。
プログラムを見てもらうと、ところどころ変わっているところが分かるはずです。
#include "r_cg_userdefine.h"
#include "./library/time.h" //wait_1ms()を使えるようにインクルード
void main_study(void)
{
int iLedOnCycleMs = 0; //経過時間カウント用変数
int iLedOnOff; //LEDの点灯消灯設定用変数
char cSelectLed = 1; //点灯させるLEDを選択(1:緑色、2:青色、3:赤色)
while(1){
//経過時間が0~500msの間はLEDを消灯
if(iLedOnCycleMs <= 500){
iLedOnOff = 0; // LEDを消灯
}
//経過時間が501ms以上の間はLEDを点灯
if(iLedOnCycleMs > 500){
iLedOnOff = 1; // LEDを点灯
}
switch(cSelectLed){
case 1:
P_GREEN_LED = iLedOnOff; // 緑色LEDを点灯 or 消灯
break;
case 2:
P_BLUE_LED = iLedOnOff; // 青色LEDを点灯 or 消灯
break;
case 3:
P_RED_LED = iLedOnOff; // 赤色LEDを点灯 or 消灯
break;
default:
break;
}
wait_1ms(); //1ms待つ
//経過時間が1000ms以上になったらカウンタをクリア
//それ以外の時は経過時間をカウントする
if(iLedOnCycleMs >= 1000){
//LEDの点灯状態をクリア
P_GREEN_LED = 0;
P_BLUE_LED = 0;
P_RED_LED = 0;
//次のLEDを選択する
if(cSelectLed >= 3){
cSelectLed = 1;
}else{
cSelectLed++;
}
iLedOnCycleMs = 0;
}else{
iLedOnCycleMs++;
}
}
}
「ifとswitchはどう使い分けたらいいの?」
さて、ここまででifとswitchを紹介してきましたが、それぞれをどう使い分けたらいいか疑問に思っているんじゃないでしょうか?
正直に言うと、ifとswitchはどちらを使っても問題ありません。
ただ、個人的な意見があります。
「こう使ったらプログラム読みやすいよね?」っていう僕の意見です。
その僕の意見としては、変数をイコールで判断する条件文(1 == iTestのような条件)が複数あるなら、switchを使った方がいいと思います。
switchを使った方が文字数が少なく書けてスッキリするんですよね。
だからプログラム自体も読みやすくなる。という意見です。
なので、あなたがどちらで書いても気にしないというなら、この基準でifとswitchを使い分けてみてくださいね。
プログラミングを続けていく上で、if文は切っても切れないものになるので、体に使い方を染み込ませるぐらい使っていきましょうね!
また分からない箇所があったり、ここが知りたい!ところがあったらコメントで質問ください。
待ってまーす!
気軽にコメントどうぞ!