2021年11月12日 (金) 05:47時点におけるMaster (トーク | 投稿記録)による版

式は、AliceScriptにおけるもっとも重要かつ基本的な要素です。AliceScriptにおいて、ほとんどのものは式で記述されます。ここでは式を値があるものすべてと定義します。

変数に定数を代入するもっとも単純な例を次に示します。

a = 1;

以上の例は、変数a1を代入します。1は、明らかに1という値です。言い換えると1は1という値を表す式なのです。 この代入の後、aの値は1であることが期待されます。そのためb = a;と書いたときもまたb = 1;と同じ動作をします。

ここでの=は代入演算子と呼ばれる演算子です。これは一つあるいは二つあるいは複数の値の操作に用いられます。 AliceScriptには多数の演算子が用意されています。これらの演算子の多くは標準でAliceScriptに組み込まれていて、変数や値を使用して基本的な操作を実行できます。演算子には次のものがあります。

代入演算子

代入演算子は、AliceScriptでおそらく最も頻繁に使用されるであろう演算子です。これは指定された変数に値を代入します。次の例を参照してください。 

var a = 1;

この例はaという名前の変数に1を代入するということを意味しています。また、varキーワードは省略したり、変数の型名を使うこともできます。

算術演算子

次の演算子は、数値型の変数を使用して算術演算を実行します。

インクリメント演算子

単項インクリメント演算子++は変数を一つずつインクリメントします。インクリメントとは、その値に1を加算することを指します。インクリメント演算子には後置インクリメント演算子x++と前置インクリメント演算子++xがあります。

後置インクリメント演算子

次の例に示すように、x++の結果はxのインクリメント前の値です。

var x = 1;
print(x);   //出力:1
print(x++); //出力:1
print(x++); //出力:2
前置インクリメント演算子

次の例に示すように、++xの結果はxのインクリメント後の値です。

var x = 1;
print(x);   //出力:1
print(++x); //出力:2
print(++x); //出力:3
デクリメント演算子

単項デクリメント演算子は変数を一つずつデクリメントします。デクリメントとは、その値から1を減算することを指します。デクリメント演算子には後置デクリメント演算子x++と前置デクリメント演算子++xがあります。

後置デクリメント演算子

次の例に示すように、x++の結果はxのデクリメント前の値です。

var x = 3;
print(x);   //出力:3
print(x++); //出力:3
print(x++); //出力:2
前置デクリメント演算子

次の例に示すように、++xの結果はxのデクリメント後の値です。

var x = 3;
print(x);   //出力:3
print(++x); //出力:2
print(++x); //出力:1
単項プラス演算子と単項マイナス演算子

単項プラス演算子+ではその値が返されます。単項マイナス演算子-ではその値の否定が返されます。 次の例を参照してください。

print(1);  //出力:1
print(-1); //出力:-1
加算演算子

加算演算子+はその値の和を返します。

print(1+1);//出力:2
減算演算子

減算演算子-はその値の差を返します。

print(2-1);//出力:1
乗算演算子

乗算演算子*はその値の積を返します。

print(2*4);//出力:8
除算演算子

除算演算子/はその値の商を返します。

print(4/2);//出力:2
べき乗演算子

べき乗演算子**は一つ目の値を二つ目の値乗した結果を返します。

print(2**2);//出力:4
複合代入

二項演算子をopと置いた場合、

x op= y;

この式は次の式と同じです。

x = x op y;

ただし、xが評価されるのは一度のみです。次の例を参照してください。

var a = 1;
a += 2;
print(a);//出力:3

a -= 1;
print(a);//出力:2

文字列連結

一方または両方の値が文字列型の場合、+演算子によってその値の文字列表現が連結されます。次に例を示します。  print("Hello,"+"World.");//出力:Hello,World.

配列の連結または追加

左辺の変数が配列型の場合、右辺が配列型ならその配列が連結され、それ以外の型なら左辺の配列に右辺の項目が追加されます。次に例を示します。

var arr = [“a”,”b”];
print(arr);//出力:a,b
arr += “c”;
print(arr);//出力:a,b,c

デリゲートの組み合わせ

左辺と右辺の両方がデリゲート型の場合、左辺のデリゲートと右辺のデリゲートが結合された新しいデリゲートが返されます。次に例を示します。

var del1 = _(){
  print(”Hello”);
};
var del2 = _(){
  print(“World”);
};

var del = del1 + del2;
del.Invoke();
//出力:Hello
//    World

等値演算子

等値演算子は左右の値が等しいかどうかを判断し、それに応じた値を返します。

等値演算子

等値演算子==または===は左右の値が等しい場合はtrueを返し、それ以外の場合はfalseを返します。次に例を示します。

print(1==1);//出力:true
非等値演算子

非等値演算子!=または!==は左右の値が異なる場合はtrueを返し、それ以外の場合はfalseを返します。この演算子は等値演算子の論理反転と捉えることができます。次に例を示します。

print(1!=2);//出力:true

比較演算子

関係演算子とも呼ばれていて、その値の比較に使用されます。これらの演算子は数値型のみに使用することができます。

小なり演算子

小なり演算子<は、左側の値が右側の値より小さい場合はtrueを、それ以外の場合はfalseを返します。次に例を示します。

print(1<2);//出力:true
大なり演算子

大なり演算子>は、左側の値が右側の値より大きい場合はtrueを、それ以外の場合はfalseを返します。次に例を示します。

print(2>1);//出力:true
以下演算子

以下演算子<は、左側の値が右側の値以下である場合はtrueを、それ以外の場合はfalseを返します。次に例を示します。

print(1<=2);//出力:true
以上演算子

以上演算子>は、左側の値が右側の値以上である場合はtrueを、それ以外の場合はfalseを返します。次に例を示します。

print(2>=1);//出力:true

論理演算子

次の演算子は、ブール型の値について論理演算を行います。

論理否定演算子

論理否定演算子!は、単項の接頭辞でその値の論理否定が計算されます。次に例を示します。

print(!true);//出力:false
論理積演算子

論理積(論理AND)演算子&または&&は、左右の値の両方がtrueと評価された場合のみtrueを返し、それ以外の場合falseを返します。&演算子と&&演算子との唯一の違いは後者は左辺がfalseと評価された場合右辺の評価は行われないことです。次に例を示します。

print(true&true); //出力:true
print(true&false);//出力:false
論理和演算子

論理和(論理OR)演算子|または||は、左右の値の少なくとも一方がtrueと評価された場合にtrueを返し、それ以外の場合にfalseを返します。|演算子と||演算子との唯一の違いは後者は左辺がtrueと評価された場合右辺の評価は行われないことです。次に例を示します。

print(true|false); //出力:true
print(false|false);//出力:false
排他的論理和演算子

排他的論理和(論理XOR)演算子^は、左右の値が異なると評価された場合(すなわち、片方がtrueと評価されたならばもう片方がfalseと評価される場合)にtrueを返し、それ以外の場合はfalseを返します。次に例を示します。

print(true^false);//出力:true
print(true^true); //出力:false

?:演算子

?:演算子(三項条件演算子)は、論理式を評価し、論理式の評価結果(TrueまたはFalse)に応じて続く二つの式のいずれかの結果を返します。

まずは次の例を参照してください。

string todo = 現在の気温 > 30.0 ? "エアコンを入れる" : "エアコンを切る";
print("todo={0}",todo);
//出力例
//現在の気温が20℃の場合 : todo=エアコンを切る
//現在の気温が32℃の場合 : todo=エアコンを入れる

上記の例では、現在の気温が30℃以上の場合、todoに「エアコンを入れる」が代入されます。 この例のように、この条件演算子の構文は次のようになります。

 条件 ? 結果A : 結果B

条件式は、論理式でTrueまたはFalseのどちらかと評価される必要があります。条件がTrueと評価された場合は、結果Aの式が評価され、条件がFalseと評価された場合は、結果Bの式が評価され、それらの結果が演算の結果として返されます。結果Aと結果Bの両方が評価されることはありません。

AliceScriptRC1時点で、条件演算子に複数の条件演算が含まれる処理は実行できません。つまり、次の式は正しく評価することができません。

a ? b : c ? d : e

条件演算子とIf文

条件演算子を使用すると、いままでIf文を使用して行ってきたことの一部を簡潔な形で書き直すことができます。If文と条件演算子を状況に応じて使い分けると、よりコードが読みやすくなります。次の例を参照してください。

if(今日の天気 == 晴れ) 
  {
   todo = "公園に行き";
  }
else
  {
   todo = "家にい";
  }
print("今日は、{0}ます。",todo);
//出力例
//今日の天気が晴れの場合 : 今日は、公園に行きます。
//今日の天気が曇りの場合 : 今日は、家にいます。

上記の例は、現在の天気が晴れであれば、todoに「公園に行き」が代入され、「今日は、公園に行きます。」が表示されます。 それ以外の場合では、todoに「家にい」が代入され、「今日は、家にいます。」が表示されます。

このコードを条件演算子を用いた書き方にすると次の例のようになります。

(今日の天気 == 晴れ) ? todo = "公園に行き" : todo = "家にい";
print("今日は、{0}ます。",todo);

これはただ単にIf文を条件演算子に書き換えただけで、あまりよい使用方法とは言えません。条件演算子の値を返すという特性を使用すれば、次の例のように書き換えることもできます。

todo = (今日の天気 == 晴れ) ? "公園に行き" : "家にい";
print("今日は、{0}ます。",todo);

上記の例のように左辺に対して条件演算の結果を代入したほうが、より簡潔かつ分かりやすくなります。条件演算子をまだよく理解していない人のためにコメントを書いておくとより良いでしょう。

条件演算子は行数を短くするよりも、他の人がコードを読んだときに簡単に理解できるようになることを期待して導入されました。基本的には、If文を使用し、条件演算子はそれを使用することで簡潔にわかりやすくなる場合のみ使用するべきです。