条件文・分岐
条件文、分岐を使ってもう少し複雑なACSを作ってみましょう。


条件文(if文)

複雑なACS(プログラム)を作るとき、条件分岐は必須の物となります。
条件によって後の動作を変更することができる"if文"を学んでいきましょう。


#include "zcommon.acs"

Script 1 ENTER
{

int a = 2;

//aの値が2ならば
if(a == 2){

print(s:"a is 2");

}

//ACS終わり
}


と表示されます。

赤い字の部分に注目してみましょう。

if(a == 2)

これは「もしaの値が2と等しければ次の{,}の内容(printの部分)を実行する」という分岐を行っています。
※もちろん、(a == 2)の中身を変えると分岐させる条件がかわります。

つまり、aが2と等しくないとき、ゲーム画面に"a is 2"は表示されません。

←イメージ

※注意:"="が2個並んでいることに注意しましょう。"=="と"="は全く別の意味です。

※aが2のとき実行させたい内容がただ一つのとき(例のようなとき)、{,}ではさむ必要はありませんが、はさむことをおすすめします。

さて、aが2でない場合にもaが2でないことを伝えるようにACSを改良してみましょう。


#include "zcommon.acs"

Script 1 ENTER
{

int a = 1;

if(a == 2){

print(s:"a is 2");

}
else{

print(s:"a is not 2");

}


//ACS終わり
}


と表示されます。

赤い字の部分を見て下さい。

else{ ... }

の部分はif文の条件(aが2と等しい)を満たさなかったときに実行される文です。(ここではelse文と呼びことにします。)
つまり、このACSを書き換えて、aを2で初期化すれば"a is 2"と画面に表示されます。

←イメージ

※最初の例のように、条件を満たさなかったときにすべき動作が無い場合は、else文を省略することができます。


さて、さきほどif文の(,)の中身には条件を入力し、条件が満たされれたすぐ後の{,}で囲まれた部分を実行し、(else文が記述されているとき、)条件が満たされなかったらelse文の内容が実行されると言いましたが、実は正確にはこの表現は正しくありません。
if文の(,)の中身に0でない数が入ると「条件が満たされた(TRUE)」と判断され、0が入ると「条件が満たされない(FALSE)」と判断されます。
"=="記号の意味は「左の内容と右の内容が等しければ1を、異なっていれば0を返す。」ということなので、見かけ上、「aと2が等しければ条件が満たされる」となるわけです。
そのことを確かめるACSを作成してみましょう。


#include "zcommon.acs"

Script 1 ENTER
{
//if(TRUE)でも可
if(1){
print(s:"TRUE");
}
else{
print(s:"FALSE");
}

}


と表示されます。

赤い字の部分を見てわかるように、if文の条件の中に1を入力しても「条件が満たされた」と解釈されます。
数字を変えてみるとわかりますが、0以外の整数なら(負の数でも)条件が満たされます。
逆に、0を入力すると、else文("FALSE")が実行されます。

次に、"=="記号の本当の役割を見てみましょう。


#include "zcommon.acs"

Script 1 ENTER
{
print(s:"1==1 is ",d:1==1,s:". 1==2 is ",d:1==2,s:".");
}


と表示されます。
このように、"=="記号の本当の意味は、先ほど述べたとおり、「左の内容と右の内容が等しければ1を、異なっていれば0を返す。」であることがわかります。


条件を記述するときに使用する記号は"=="だけではありません。よく使用する記号を紹介します。

記号 意味
== 左の値と右の値が等しければ1を、異なれば0を返します。(イコールに似ています。)
!= 左の値と右の値が異なれば1を、等しければ0を返します。(ノットイコールに似ています。)
> 左の値が右の値より大きければ1を、そうでなければ0を返します。
< 左の値が右の値より小さければ1を、そうでなければ0を返します。
>= 左の値が右の値以上であれば1を、そうでなければ0を返します。
<= 左の値が右の値以下であれば1を、そうでなければ0を返します。

分岐(switch文)

3通り以上の条件分岐を行うとき、if文では記述しづらい時があります。
こんな時に便利なのがswitch文です。

まずは例を見てみましょう。


#include "zcommon.acs"

Script 1 ENTER
{
int a;
a = 3;

switch( a ){

//aの値が1のとき
case 1:
print(s:"a is 1");
break;

//aの値が2のとき
case 2:
print(s:"a is 2");
break;

//aの値が3のとき
case 3:
print(s:"a is 3");
break;

//aの値がそれ以外のとき
default:
print(s:"Error!");
break;

}
}


と表示されます。

まず、赤い字の部分を見てみましょう。
今回は内容を抽出します。


swtich( /*式*/ ){

//分岐内容

}


このようにswitch文を宣言することで、"式"の部分の値(今回はa)によって、以下に続く中括弧の内容を分岐して実行します。
例えば、例のACSでは、aの値が3なので、

case 3:
print(s:"a is 3");
break;

の部分が実行されます。(caseの行の最後の":"はセミコロンではありません。コロンです。注意しましょう。)
case 3:
に分岐した後は、最初の
break; (break文)
で分岐を終了し、switch文の中括弧から脱出します。

aの値が2ならば
case 2:
の部分が、aの値が1ならば
case 1:
の部分が実行されます。

では、aの値が1,2,3のいずれでもない場合はどうなるのでしょうか。
実際に実行してみるとわかりますが、
default:
print(s:"Error!");
break;
の部分(例外時のコマンド)が実行されます。(つまり、画面に"Error!"と表示されます。)

switch文を一般的な形に直してみると、


switch(/*式*/){

case 値1:
//値1でのコマンド
break;

case 値2:
//値2でのコマンド
break;

//必要に応じて増やして下さい。

default:
//例外のコマンド
break;
//"default"に限らず最後であれば"break;"は書く必要はありませんが、書くことをおすすめします。
}


となります。(ちなみに、case 値: とか default: の部分はタグと呼びます。)

では、switch文を少し変更してみて、次の様なACSを記述したらどうなるでしょうか。


#include "zcommon.acs"

Script 1 ENTER
{
int a;
a = 4;

switch( a ){

//break文が無い。
case 1:
case 2:
print(s:"case 1 or 2");
break;

case 3:
print(s:"case 3");
break;

//break文が無い。
case 4:
a = 0;

case 5:
print(s:"a is ",d:a);
break;

default:
print(s:"Error!");
break;

}
}


と表示されます。

例を見てわかるように、case 1とcase 4の部分にbreak文が無いことがわかります。
また、結果を見てわかるように、break文が無いと、分岐の内容が終わったとき、switch文から脱出するのではなく、そのまま次の分岐の内容を実行することがわかります。
たとえば、case 4を実行した場合、aに0を代入した後、そのままcase 5を実行していることがわかります。

←イメージ


まとめ

・if文の形は↓
if( /* 条件 */ ){
//条件が満たされたときの内容
}
else{
//そうでないときの内容(省略可)
}
・条件とは、0でない(TRUE)か0であるか(FALSE)の違いである。
・"=="などの記号は0か1を返している。

・switch文の形は↓
switch( /* 式 */ ){

case 値1:
//値1の内容
break;

//...

default:
//例外時の内容
break;
}
・break文を省くとswitch文のの動作が変わる


Home Back Next