改めて前回の内容をおさらいをしておくと、
- if文は「~したら・・・する」という条件演算子の1つである。
- if文は()内に書かれている記述について「正しい(true)」か「正しくないか(false)」の判定を行い、「正しい(true)」の場合に{}内の記述を実行する。
- if文において、{}内の処理内容が、一つの記述式(=セミコロンで締めくくる記述式が一つだけ)で完結するなら{}の省略が可能
ということをお伝えしました。
今回は else文 についてお話ししたいと思います。
else文はif文とセットで使われる、プログラミングの条件分岐を担う重要構文です。
今回も丁寧な解説を心がけていますので、バッチリ理解してEA開発への道のりを1歩進めていきましょう。
※「true」や「false」といったbool型 についての扱い方や理解がまだよくわからないという方は以下の記事をご覧ください。
else文 とは?
そもそもの、else という英単語は
「そのほかの、別の」という意味を表す副詞であり、else文 もその意を組んだ処理文となっています。
で、端的に言えば
if文の内容が「正しくない(false)」と判定された場合に、それを受けて発動する記述
になります。
従って、else文単独で記述することはありません。
(単独で記述していた場合、illegal ‘else’ without matching ‘if’「対応するifがない不適切なelseです」というコンパイルエラーが発生してしまいます)↓
ifの()内に記載されている条件が「正しくない(false)」である場合、それを受けてelse文が発動します。↓
void OnStart()
{
//変数「varBool」を宣言し、falseを代入
bool varBool=false;
//varBoolがtrueなら
if(varBool==true)
{
//trueとログ出力する
Print(true);
}
//そうでないなら(=varBoolがfalseなら)、falseとログ出力する
else Print(false);
}
//+------------------------------------------------------------------+
従って、
if(varBool==true)
という条件文は「正しくない(false)」となり、if文の{}内容は執行されません。
if文の条件が「正しくない(false)」であったことを受けて、初めてelse文のコード記述が判定・執行されます。
「そうでないなら(=varBoolがfalseなら)」
という条件に合致しているので、、執行内容である、
Print(false);
が執行されます。
※なお、elseの後の、執行文記述についてはif文と同じく、
{}内の処理内容が、一つの記述式(=セミコロンで締めくくる記述式が一つだけ)で完結するなら{}の省略が可能
となっています。今回のサンプルコードのような
Print(false);だけ、といった場合ですね。
執行内容記述が複数文ある場合は、{}が必要となります。↓
void OnStart()
{
//変数「varBool」を宣言し、falseを代入
bool varBool=false;
//varBoolがtrueなら
if(varBool==true)
{
//trueとログ出力する
Print(true);
}
//そうでないなら(=varBoolがfalseなら)、falseとログ出力する
else
{
//falseとログ出力する
Print(false);
//falseとコメント出力する
Comment(false);
}
}
//+------------------------------------------------------------------+
elseの執行文、
Print(false);に
Comment(false);
を加えたいので、{}を用いて、処理記述全体を挟みました。
else文を使わずに記述しようとすると条件文記述は
if(varBool==false)
になる訳ですが、else文を使う事によって条件文を具体的に記述する事を省略できます。
ここまでが、else文の基本なのですが、ここまで見て頂いたのは
です。
もしAの条件だったら、~する。Aの条件じゃなかったら・・・する。
というパターンですね。
今度は条件分岐が3つ以上になった場合の、if文とelse文の使い方を見てみましょう。
条件分岐が3つ以上ある場合の記述 -else if文-
条件分岐が3つ以上ある場合、if と else の合成演算子である、
というキーワードを合わせて用いることで記述をしていきます。↓
void OnStart()
{
//変数「varStr1」を宣言し、"horse"を代入
string varStr1="horse";
//varStr1がrabbitなら
if(varStr1=="rabbit")
{
//rabbitとログ出力する
Print("rabbit");
}
//そうでなく(=varBoolがrabbitなく)、
//varStr1がFoxなら
else
if(varStr1=="Fox")
{
//Foxとログ出力する
Print("Fox");
}
//どちらでもない(=varStr1がrabbitでもFoxでもないなら)
else
Print("Not rabbit or Fox");
}
今回のサンプルコードにおいて、条件判定の材料とされているのは、
「varStr1」には、文字列 ”horse” が代入されている状態です。
最初のif文条件
if(varStr1==”rabbit”)は正しくないので、if文の{}内容
Print(“rabbit”);
は執行されません。
if文の条件否定を受けて、今度は
else ifの条件判定に移ります。
else ifの条件
(varStr1==”Fox”)は正しくないので、の{}内容は執行されません。
elseの
条件判定に移ります。
elseの条件は明示的に記述されていませんが、読み解くと
(varStr1がrabbitでもFoxでもないなら)
ということになりますが、この内容は正しい(=true)です。
従って、{}内容
Print(“Not rabbit or Fox”);が執行されます。
サンプルコードの例は、条件分岐が3つの例でしたが、条件分岐が3つ以上の場合はelse ifの数を増やすことによって、対応します。
void OnStart()
{
//変数「varStr1」を宣言し、"horse"を代入
string varStr1="horse";
//varStr1がrabbitなら
if(varStr1=="rabbit")
{
//rabbitとログ出力する
Print("rabbit");
}
//そうでなく(=varBoolがrabbitなく)、
//varStr1がFoxなら
else
if(varStr1=="Fox")
{
//Foxとログ出力する
Print("Fox");
}
//そうでなく(=varBoolがrabbitなく、Foxでもなく)、
//varStr1がlionなら
else
if(varStr1=="lion")
{
//lionとログ出力する
Print("lion");
}
//どちらでもない(=varStr1がrabbitでもFoxでもlionでもないなら)
else
Print("Not rabbit or Fox or lion");
}
条件分岐が4つになり、
という記述構成に変わりました。
else ifは必ず、if文より後に記述されなくてはいけませんし、else文より前に記述されなくてはいけません。
また
if文~else ifが連なる記述だからと言って、最後に必ずelse文の配置が必須という訳ではありません。
else文はあくまで、「if文、else if全てが否定された時に執行される記述」であり、「if文、else if全てが否定された時に執行される記述」自体が必要なければ文法的には問題ないですし、コンパイルエラーが発生することもありません。↓
void OnStart()
{
//変数「varStr1」を宣言し、"horse"を代入
string varStr1="horse";
//varStr1がrabbitなら
if(varStr1=="rabbit")
{
//rabbitとログ出力する
Print("rabbit");
}
//そうでなく(=varBoolがrabbitなく)、
//varStr1がFoxなら
else
if(varStr1=="Fox")
{
//Foxとログ出力する
Print("Fox");
}
//そうでなく(=varBoolがrabbitなく、Foxでもなく)、
//varStr1がlionなら
else
if(varStr1=="lion")
{
//lionとログ出力する
Print("lion");
}
/*varStr1にはhorseがはいっておらず、else文もない為、
このままだと何のログ出力もされないが、そういう意図でプログラミング
しているのであれば問題ない*/
}
おまけ
else ifはともかく、
else文は先述した通り、
条件内容を明示的に記述しないため、条件判定に詰めの甘さを残す場合、else文の記述箇所が原因で、意図しない動作を引き起こしがちです。
条件分岐の数が多いときに、日本語で「あれでもなくて、これでもなくて・・・」みたいな思考で整理をしようとするのは間違いのもとです。
あくまで、
else文の前に記述されている if文 や else ifの条件が全てfalseの場合に執行される
というelse文の大前提を押さえたうえで、コメントアウト箇所に、else文の条件内容を具体的に記載して条件を視認・整理できるようにおくなどの対策を取り、慎重に開発を進めた方が良いと思います。
あるいは、いっそのこと最初のうちは、else文を使わず、多少コードが冗長になっても、
if文と else ifだけで全ての条件分岐が明示的に記述されるように構成していく、というのも一つの手段かと思います。
コメント