式
この記事のより新しい版がWSOFTDocsにあります。AliceScriptWikiでは、この記事はもう更新されません。 |
式は、AliceScriptにおけるもっとも重要かつ基本的な要素です。AliceScriptにおいて、ほとんどのものは式で記述されます。ここでは式を値があるものすべてと定義します。
変数に定数を代入するもっとも単純な例を次に示します。
a = 1;
以上の例は、変数a
に1
を代入します。1
は、明らかに1という値です。言い換えると1
は1という値を表す式なのです。
この代入の後、a
の値は1であることが期待されます。そのためb = a;
と書いたときもまたb = 1;
と同じ動作をします。
ここでの=
は代入演算子と呼ばれる演算子です。これは一つあるいは二つあるいは複数の値の操作に用いられます。
AliceScriptには多数の演算子が用意されています。これらの演算子の多くは標準でAliceScriptに組み込まれていて、変数や値を使用して基本的な操作を実行できます。演算子には次のものがあります。
代入演算子[編集]
代入演算子は、AliceScriptでおそらく最も頻繁に使用されるであろう演算子です。これは指定された変数に値を代入します。次の例を参照してください。
var a = 1;
この例はa
という名前の変数に1
を代入するということを意味しています。また、var
キーワードを使うと変数の宣言を、省略すると変数に代入します。さらに、複数の変数への代入を同時に行うこともできます。次に例を示します。
var a = b = 1;
算術演算子[編集]
次の演算子は、数値型の変数を使用して算術演算を実行します。
インクリメント演算子[編集]
単項インクリメント演算子++
は変数を一つずつインクリメントします。インクリメントとは、その値に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
べき乗演算子[編集]
べき乗演算子**
は1つ目の値を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
Null合体演算子[編集]
Null合体演算子[編集]
Null合体演算子??
は、左の値がnull
でない場合その値を返し、それ以外の場合は右の値が評価され返されます。次に例を示します。
var v = “ABC”; print(v??”Hello,World”);//出力:ABC v = null; print(v??”Hello,World”);//出力:Hello,World
Null合体代入演算子[編集]
Null合体代入演算子??=
は、その値がnull
と評価された場合のみ右辺の値を代入し、それ以外の場合は何もしません。次に例を示します。
var v = null; v ??= "Hello,World"; print(v);//出力:Hello,World
型一致演算子[編集]
型一致演算子is
は、左辺の値の型が右辺の値の表す型と一致するか、右辺の値の型と一致する場合はtrue
を、それ以外の場合はfalse
を返します。次に例を示します。
string str = "Hello,World"; if(str is string) { print(str); } //出力:Hello,World
型変換演算子[編集]
型変換演算子as
は、左辺の値を右辺の表す型に変換します。右辺はtype
型である必要があり、型変換に失敗した場合はnull
を返します。次に例を示します。
number num = 12345; print(num.type);//出力:NUMBER var str = (num as string); print(str.type);//出力:STRING
条件演算子[編集]
条件演算子(三項条件演算子)?:
は、論理式を評価し、論理式の評価結果(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文を使用し、条件演算子はそれを使用することで簡潔にわかりやすくなる場合のみ使用するべきです。