編集の要約なし
編集の要約なし
 
(同じ利用者による、間の32版が非表示)
1行目: 1行目:
{{Alert|この記事のより新しい版が[https://docs.wsoft.ws/products/alice/general/expression/ WSOFTDocs]にあります。AliceScriptWikiでは、この記事はもう更新されません。||04}}
[[Category:基本]]
[[Category:基本]]
式は、AliceScriptにおけるもっとも重要かつ基本的な要素です。AliceScriptにおいて、ほとんどのものは式で記述されます。ここでは式を値があるものすべてと定義します。
式は、AliceScriptにおけるもっとも重要かつ基本的な要素です。AliceScriptにおいて、ほとんどのものは式で記述されます。ここでは式を値があるものすべてと定義します。
9行目: 11行目:
ここでの<code>=</code>は代入演算子と呼ばれる演算子です。これは一つあるいは二つあるいは複数の値の操作に用いられます。
ここでの<code>=</code>は代入演算子と呼ばれる演算子です。これは一つあるいは二つあるいは複数の値の操作に用いられます。
AliceScriptには多数の演算子が用意されています。これらの演算子の多くは標準でAliceScriptに組み込まれていて、変数や値を使用して基本的な操作を実行できます。演算子には次のものがあります。
AliceScriptには多数の演算子が用意されています。これらの演算子の多くは標準でAliceScriptに組み込まれていて、変数や値を使用して基本的な操作を実行できます。演算子には次のものがあります。
====代入演算子====
==代入演算子==
代入演算子は、AliceScriptでおそらく最も頻繁に使用されるであろう演算子です。これは指定された変数に値を代入します。次の例を参照してください。 
代入演算子は、AliceScriptでおそらく最も頻繁に使用されるであろう演算子です。これは指定された変数に値を代入します。次の例を参照してください。 
  var a = 1;
  var a = 1;
この例は<code>a</code>という名前の変数に<code>1</code>を代入するということを意味しています。また、<code>var</code>キーワードは省略したり、変数の型名を使うこともできます。
この例は<code>a</code>という名前の変数に<code>1</code>を代入するということを意味しています。また、<code>var</code>キーワードを使うと変数の宣言を、省略すると変数に代入します。さらに、複数の変数への代入を同時に行うこともできます。次に例を示します。
====算術演算子====
var a = b = 1;
 
==算術演算子==
次の演算子は、数値型の変数を使用して算術演算を実行します。
次の演算子は、数値型の変数を使用して算術演算を実行します。
 
===インクリメント演算子===
=====インクリメント演算子=====
単項インクリメント演算子<code>++</code>は変数を一つずつインクリメントします。インクリメントとは、その値に1を加算することを指します。インクリメント演算子には後置インクリメント演算子<code>x++</code>と前置インクリメント演算子<code>++x</code>があります。
単項インクリメント演算子<code>++</code>は変数を一つずつインクリメントします。インクリメントとは、その値に1を加算することを指します。インクリメント演算子には後置インクリメント演算子<code>x++</code>と前置インクリメント演算子<code>++x</code>があります。
======後置インクリメント演算子======
====後置インクリメント演算子====
次の例に示すように、<code>x++</code>の結果は<code>x</code>のインクリメント前の値です。
次の例に示すように、<code>x++</code>の結果は<code>x</code>のインクリメント前の値です。
  var x = 1;
  var x = 1;
24行目: 27行目:
  print(x++); //出力:1
  print(x++); //出力:1
  print(x++); //出力:2
  print(x++); //出力:2
 
====前置インクリメント演算子====
======前置インクリメント演算子======
次の例に示すように、<code>++x</code>の結果は<code>x</code>のインクリメント後の値です。
次の例に示すように、<code>++x</code>の結果は<code>x</code>のインクリメント後の値です。
  var x = 1;
  var x = 1;
31行目: 33行目:
  print(++x); //出力:2
  print(++x); //出力:2
  print(++x); //出力:3
  print(++x); //出力:3
 
===デクリメント演算子===
=====デクリメント演算子=====
単項デクリメント演算子<code>—-</code>は変数を一つずつデクリメントします。デクリメントとは、その値から1を減算することを指します。デクリメント演算子には後置デクリメント演算子<code>x++</code>と前置デクリメント演算子<code>++x</code>があります。
単項デクリメント演算子<code>—</code>は変数を一つずつデクリメントします。デクリメントとは、その値から1を減算することを指します。デクリメント演算子には後置デクリメント演算子<code>x++</code>と前置デクリメント演算子<code>++x</code>があります。
====後置デクリメント演算子====
======後置デクリメント演算子======
次の例に示すように、<code>x++</code>の結果は<code>x</code>のデクリメント前の値です。
次の例に示すように、<code>x++</code>の結果は<code>x</code>のデクリメント前の値です。
  var x = 3;
  var x = 3;
40行目: 41行目:
  print(x++); //出力:3
  print(x++); //出力:3
  print(x++); //出力:2
  print(x++); //出力:2
 
====前置デクリメント演算子====
======前置デクリメント演算子======
次の例に示すように、<code>++x</code>の結果は<code>x</code>のデクリメント後の値です。
次の例に示すように、<code>++x</code>の結果は<code>x</code>のデクリメント後の値です。
  var x = 3;
  var x = 3;
48行目: 48行目:
  print(++x); //出力:1
  print(++x); //出力:1


=====単項プラス演算子と単項マイナス演算子=====
===単項プラス演算子と単項マイナス演算子===
単項プラス演算子<code>+</code>ではその値が返されます。単項マイナス演算子<code>-</code>ではその値の否定が返されます。
単項プラス演算子<code>+</code>ではその値が返されます。単項マイナス演算子<code>-</code>ではその値の否定が返されます。
次の例を参照してください。
次の例を参照してください。
  print(1);  //出力:1
  print(+1);  //出力:1
  print(-1); //出力:-1
  print(-1); //出力:-1
 
===加算演算子===
=====乗算演算子=====
加算演算子<code>+</code>はその値の和を返します。
print(1+1);//出力:2
===減算演算子===
減算演算子<code>-</code>はその値の差を返します。
print(2-1);//出力:1
===乗算演算子===
乗算演算子<code>*</code>はその値の積を返します。
乗算演算子<code>*</code>はその値の積を返します。
  print(2*4);//出力:8
  print(2*4);//出力:8
 
===除算演算子===
=====除算演算子=====
除算演算子<code>/</code>はその値の商を返します。
除算演算子<code>/</code>はその値の商を返します。
  print(4/2);//出力:2
  print(4/2);//出力:2
===べき乗演算子===
べき乗演算子<code>**</code>は1つ目の値を2つ目の値乗した値を返します。
print(2**2);//出力:4


=====加算演算子=====
===複合代入===
加算演算子<code>+</code>はその値の和を返します。
二項演算子を<code>op</code>と置いた場合、
  print(1+1);//出力:2
  x op= y;
 
この式は次の式と同じです。
=====減算演算子=====
x = x op y;
減算演算子<code>-</code>はその値の差を返します。
ただし、<code>x</code>が評価されるのは一度のみです。次の例を参照してください。
  print(2-1);//出力:1
var a = 1;
 
a += 2;
・比較演算子
  print(a);//出力:3
 
・論理演算子
a -= 1;
 
print(a);//出力:2
+および+=演算子
==文字列連結==
 
一方または両方の値が文字列型の場合、<code>+</code>演算子によってその値の文字列表現が連結されます。次に例を示します。
・文字列の連結
print("Hello,"+"World.");
 
//出力:Hello,World.
左辺または両方の変数が文字列型の場合、+演算子によってその変数の文字列(あるいは文字列表現)が連結されます
 
 print("Hello,"+"World.");
 
・配列の連結または追加
 
左辺の変数が配列型の場合、+=演算子によって配列が連結されるか、あるいは末尾に項目が追加されます
 
・イベントの組み合わせ
 
左辺がイベントオブジェクトかつ右辺がデリゲート型の場合、+=演算子によってイベントが呼び出されるとすでに登録されているデリゲートを呼び出してから右辺のデリゲートを呼び出すようにイベントオブジェクトに追加します。
 
・加算代入演算子としての+=
 
次のような式があるとします
 
 x+=y
 
上記の式は、次の式と同じです。
 
 x=x+y
 
ただし、xが評価されるのは一度だけです。


?:演算子
==配列の連結または追加==
左辺の変数が配列型の場合、右辺が配列型ならその配列が連結され、それ以外の型なら左辺の配列に右辺の項目が追加されます。次に例を示します。
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
==ラムダ演算子==
ラムダ演算子<code>=></code>は、[[デリゲート#ラムダ式|ラムダ式]]の定義時に、左側の引数指定部と右側の式本体を分ける機能を持ち、それ以外の機能はありません。詳細については、[[デリゲート#ラムダ式|ラムダ式]]を参照してください。
==等値演算子==
等値演算子は左右の値が等しいかどうかを判断し、それに応じた値を返します。
===等値演算子===
等値演算子<code>==</code>または<code>===</code>は左右の値が等しい場合は<code>true</code>を返し、それ以外の場合は<code>false</code>を返します。次に例を示します。
print(1==1);//出力:true
===非等値演算子===
非等値演算子<code>!=</code>または<code>!==</code>は左右の値が異なる場合は<code>true</code>を返し、それ以外の場合は<code>false</code>を返します。この演算子は等値演算子の論理反転と捉えることができます。次に例を示します。
print(1!=2);//出力:true
==比較演算子==
関係演算子とも呼ばれていて、その値の比較に使用されます。これらの演算子は数値型のみに使用することができます。
===小なり演算子===
小なり演算子<code><</code>は、左側の値が右側の値より小さい場合は<code>true</code>を、それ以外の場合は<code>false</code>を返します。次に例を示します。
print(1<2);//出力:true
===大なり演算子===
大なり演算子<code>></code>は、左側の値が右側の値より大きい場合は<code>true</code>を、それ以外の場合は<code>false</code>を返します。次に例を示します。
print(2>1);//出力:true
===以下演算子===
以下演算子<code><</code>は、左側の値が右側の値以下である場合は<code>true</code>を、それ以外の場合は<code>false</code>を返します。次に例を示します。
print(1<=2);//出力:true
===以上演算子===
以上演算子<code>></code>は、左側の値が右側の値以上である場合は<code>true</code>を、それ以外の場合は<code>false</code>を返します。次に例を示します。
print(2>=1);//出力:true
==論理演算子==
次の演算子は、ブール型の値について論理演算を行います。
===論理否定演算子===
論理否定演算子<code>!</code>は、単項の接頭辞でその値の論理否定が計算されます。次に例を示します。
print(!true);//出力:false
===論理積演算子===
論理積(論理AND)演算子<code>&</code>または<code>&&</code>は、左右の値の両方が<code>true</code>と評価された場合のみ<code>true</code>を返し、それ以外の場合<code>false</code>を返します。<code>&</code>演算子と<code>&&</code>演算子との唯一の違いは後者は左辺が<code>false</code>と評価された場合右辺の評価は行われないことです。次に例を示します。
print(true&true); //出力:true
print(true&false);//出力:false
===論理和演算子===
論理和(論理OR)演算子<code>|</code>または<code>||</code>は、左右の値の少なくとも一方が<code>true</code>と評価された場合に<code>true</code>を返し、それ以外の場合に<code>false</code>を返します。<code>|</code>演算子と<code>||</code>演算子との唯一の違いは後者は左辺が<code>true</code>と評価された場合右辺の評価は行われないことです。次に例を示します。
print(true|false); //出力:true
print(false|false);//出力:false


?:演算子(三項条件演算子)は、論理式を評価し、論理式の評価結果(TrueまたはFalse)に応じて続く二つの式のいずれかの結果を返します。
===排他的論理和演算子===
排他的論理和(論理XOR)演算子<code>^</code>は、左右の値が異なると評価された場合(すなわち、片方が<code>true</code>と評価されたならばもう片方が<code>false</code>と評価される場合)に<code>true</code>を返し、それ以外の場合は<code>false</code>を返します。次に例を示します。
print(true^false);//出力:true
print(true^true); //出力:false
=Null合体演算子=
==Null合体演算子==
Null合体演算子<code>??</code>は、左の値が<code>null</code>でない場合その値を返し、それ以外の場合は右の値が評価され返されます。次に例を示します。
var v = “ABC”;
print(v??”Hello,World”);//出力:ABC
v = null;
print(v??”Hello,World”);//出力:Hello,World
==Null合体代入演算子==
Null合体代入演算子<code>??=</code>は、その値が<code>null</code>と評価された場合のみ右辺の値を代入し、それ以外の場合は何もしません。次に例を示します。
var v = null;
v ??= "Hello,World";
print(v);//出力:Hello,World


まずは次の例を参照してください。
=型一致演算子=
型一致演算子<code>is</code>は、左辺の値の型が右辺の値の表す型と一致するか、右辺の値の型と一致する場合は<code>true</code>を、それ以外の場合は<code>false</code>を返します。次に例を示します。
string str = "Hello,World";
if(str is string)
{
  print(str);
}
//出力:Hello,World
=型変換演算子=
型変換演算子<code>as</code>は、左辺の値を右辺の表す型に変換します。右辺は<code>type</code>型である必要があり、型変換に失敗した場合は<code>null</code>を返します。次に例を示します。
number num = 12345;
print(num.type);//出力:NUMBER
var str = (num as string);
print(str.type);//出力:STRING
=条件演算子=
条件演算子(三項条件演算子)<code>?:</code>は、論理式を評価し、論理式の評価結果(<code>true</code>または<code>false</code>)に応じて続く二つの式のいずれかの結果を返します。まずは次の例を参照してください。
string todo = 現在の気温 > 30.0 ? "エアコンを入れる" : "エアコンを切る";
print("todo={0}",todo);
//出力例
//現在の気温が20℃の場合 : todo=エアコンを切る
//現在の気温が32℃の場合 : todo=エアコンを入れる
上記の例では、現在の気温が30℃以上の場合、<code>todo</code>に「エアコンを入れる」が代入されます。


 string todo = 現在の気温 > 30.0 ? "エアコンを入れる" : "エアコンを切る";
 print("todo={0}",todo);
 //出力例
 //現在の気温が20℃の場合 : todo=エアコンを切る
 //現在の気温が32℃の場合 : todo=エアコンを入れる
上記の例では、現在の気温が30℃以上の場合、todoに「エアコンを入れる」が代入されます。
この例のように、この条件演算子の構文は次のようになります。
この例のように、この条件演算子の構文は次のようになります。
 
条件 ? 結果A : 結果B
 条件 ? 結果A : 結果B
<code>条件</code>式は、論理式で<code>true</code>または<code>false</code>のどちらかと評価される必要があります。<code>条件</code>が<code>true</code>と評価された場合は、<code>結果A</code>の式が評価され、<code>条件</code>が<code>false</code>と評価された場合は、<code>結果B</code>の式が評価され、それらの結果が演算の結果として返されます。結果Aと結果Bの両方が評価されることはありません。
 
<code>条件</code>式は、論理式でTrueまたはFalseのどちらかと評価される必要があります。<code>条件</code>がTrueと評価された場合は、<code>結果A</code>の式が評価され、<code>条件</code>がFalseと評価された場合は、<code>結果B</code>の式が評価され、それらの結果が演算の結果として返されます。結果Aと結果Bの両方が評価されることはありません。


AliceScriptRC1時点で、条件演算子に複数の条件演算が含まれる処理は実行できません。つまり、次の式は正しく評価することができません。
AliceScriptRC1時点で、条件演算子に複数の条件演算が含まれる処理は実行できません。つまり、次の式は正しく評価することができません。
 
a ? b : c ? d : e
 a ? b : c ? d : e
===条件演算子とIf文===
 
条件演算子とIf文
 
条件演算子を使用すると、いままでIf文を使用して行ってきたことの一部を簡潔な形で書き直すことができます。If文と条件演算子を状況に応じて使い分けると、よりコードが読みやすくなります。次の例を参照してください。
条件演算子を使用すると、いままでIf文を使用して行ってきたことの一部を簡潔な形で書き直すことができます。If文と条件演算子を状況に応じて使い分けると、よりコードが読みやすくなります。次の例を参照してください。
 
if(今日の天気 == 晴れ) 
 if(今日の天気 == 晴れ)
  {
 
    todo = "公園に行き";
  {
  }
     todo = "公園に行き";
else
  }
  {
 else
    todo = "家にい";
  {
  }
     todo = "家にい";
print("今日は、{0}ます。",todo);
  }
//出力例
 print("今日は、{0}ます。",todo);
//今日の天気が晴れの場合 : 今日は、公園に行きます。
 //出力例
//今日の天気が曇りの場合 : 今日は、家にいます。
 //今日の天気が晴れの場合 : 今日は、公園に行きます。
 //今日の天気が曇りの場合 : 今日は、家にいます。
 
上記の例は、現在の天気が晴れであれば、todoに「公園に行き」が代入され、「今日は、公園に行きます。」が表示されます。
上記の例は、現在の天気が晴れであれば、todoに「公園に行き」が代入され、「今日は、公園に行きます。」が表示されます。
それ以外の場合では、todoに「家にい」が代入され、「今日は、家にいます。」が表示されます。
それ以外の場合では、todoに「家にい」が代入され、「今日は、家にいます。」が表示されます。


このコードを条件演算子を用いた書き方にすると次の例のようになります。
このコードを条件演算子を用いた書き方にすると次の例のようになります。
 
(今日の天気 == 晴れ) ? todo = "公園に行き" : todo = "家にい";
 (今日の天気 == 晴れ) ? todo = "公園に行き" : todo = "家にい";
print("今日は、{0}ます。",todo);
 print("今日は、{0}ます。",todo);


これはただ単にIf文を条件演算子に書き換えただけで、あまりよい使用方法とは言えません。条件演算子の値を返すという特性を使用すれば、次の例のように書き換えることもできます。
これはただ単にIf文を条件演算子に書き換えただけで、あまりよい使用方法とは言えません。条件演算子の値を返すという特性を使用すれば、次の例のように書き換えることもできます。
 
todo = (今日の天気 == 晴れ) ? "公園に行き" : "家にい";
 todo = (今日の天気 == 晴れ) ? "公園に行き" : "家にい";
print("今日は、{0}ます。",todo);
 print("今日は、{0}ます。",todo);


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


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