目次
演算子とは
演算子(オペレーター)とは、与えられた変数やリテラルに対して演算を行うための記号のことです。演算子によって処理される対象のことを被演算子(オペランド)といいます。演算子の左側を左オペランド、右側を右オペランドといいます。
以下の画像の加算演算子(+)を見たとき、左側にあるxが左オペランド、右側にある5が右オペランドとなります。
演算子は算術演算子、連結演算子、代入演算子、比較演算子、論理演算子、ビット演算子に分類できます。
算術演算子
算術演算子とは、四則演算(加減乗除)や剰余など算術を行うための演算子です。加算・減算は算数で使う記号と同じですが、乗算は×ではなく*、除算は÷ではなく/を使います。またMODは余りを取得する演算である剰余演算(モジュロ演算)を意味する単語moduloからきていてモッドと読みます。
演算子 | 名称 | 説明 |
---|---|---|
+ | 加算 | 2つのオペランドを加算した結果を返します。 |
- | 減算 | 左オペランドから右オペランドを減算した結果を返します。 |
* | 乗算 | 2つのオペランドの乗算した結果を返します。 |
/ | 除算 | 左オペランドを被除数、右オペランドを除数とした除算結果を返します。 |
MOD | 剰余 | 左オペランドを右オペランドで除算した剰余を返します。 |
ゼロ除算
ゼロ除算とは、ある数を0で割ることで数学おいては定義されていない演算です。多くのプログラミング言語ではエラーを返しますが、UWSCでは0で割った結果はエラーにならず0(Double型)を返します。
PRINT 5 / 0
- 結果
0
MOD(剰余演算)
剰余演算は、ある数値を別の数値で除算し余りを取得する演算をします。
被除数をdividend、除数をdivisorとすると剰余を求めるプログラムは以下のように書きます。
dividend MOD divisor
MODを使わずに書くと以下のようになり、被除数・除数は小数の値を指定した場合は偶数丸めをして整数の値に変換してから計算します。
dividend = ROUND(dividend)
divisor = ROUND(divisor)
dividend - INT(dividend / divisor) * divisor
剰余演算が返す結果は、被除数が正の場合は0 <= x < divisor - 1、負の場合は0 <= x < -1 * divisor + 1の範囲の整数です。
例えば23を4で除算した余りを求めるには、以下のように記述します。23/4=5余り3なので、余りの3が出力されます。
PRINT 23 MOD 4
以下の表は被除数・除数の符号による結果の違いを示したものです。表からもわかるように、剰余演算の結果は被除数の符号と同じになります。
被除数 | 除数 | 結果 |
---|---|---|
正 | 正 | 正 |
正 | 負 | 正 |
負 | 正 | 負 |
負 | 負 | 負 |
PRINT 23 MOD 4 // 3
PRINT 23 MOD -4 // 3
PRINT -23 MOD 4 // -3
PRINT -23 MOD -4 // -3
除数が-0.5〜0.5(偶数丸めをしたときに0になる値)の場合、結果はエラーになります。
被除数よりも除数の値が大きい場合は、被除数の値が返ります。被除数・除数ともに符号を無視して絶対値で判断します。
PRINT 12 MOD 13 // 12
PRINT 9 MOD -10 // 9
PRINT -3 MOD 5 // -3
PRINT -12 MOD -15 // -12
除数が1のとき被除数の値に関わらず、結果は必ず0になります。
PRINT 120 MOD 1 // 0
連結演算子
文字を連結させるための演算子です。算術演算子と同じ+が使われますが、オペランドがどちらも数値なら算術演算子(加算)、どちらか片方でも文字列なら連結演算子として扱われます。
演算子 | 名称 | 説明 |
---|---|---|
+ | 連結演算子 | 左オペランドと右オペランドを連結した結果を文字列型で返します。 |
文字列の連結には加算演算子(+)を使います。これは算術演算子の和を求めるときの記号と同じです。和を求めるか連結するかは、操作対象の型によって異なります。
加算演算子は、演算子の両側が数値の場合は加算、それ以外の場合は結合になります。
例えば以下の場合、左から順に処理されていくので"12+3=" + 12で文字列になってしまい、12 + 3は15ではなく123と出力されてしまいます。
PRINT "12+3=" + 12 + 3 // ("12+3=" + 12) + 3 = 123
この場合( )を使い数値同士の加算を先に行うことで、15と出力されるようになります。
PRINT "12+3=" + (12 + 3) // 15
数値を文字列として結合したい場合は先頭に""を記述することで数値を文字列にできます。
以下の場合a,bともに数値なので、結合ではなく加算されて51と出力されてしまいます。
DIM a = 45
DIM b = 6
PRINT a + b // 51
"" + aで文字列になるので、a + bを結合して456と出力できます。
DIM a = 45
DIM b = 6
PRINT "" + a + b // ("" + a) + b = 456
代入演算子
変数などに値を代入するための演算子です。算術演算子と組み合わせる複合代入演算子(+=、-=、*=、/=など)は使えません。
演算子 | 名称 | 説明 |
---|---|---|
= | 代入演算子 | 右オペランドの値を左オペランドに代入します。 |
比較演算子
2つの値や式の大小を比較する演算子で、結果をブール型(TrueまたはFalse)で返します。等価演算子(=)は代入演算子と同じ記号が使われます。代入演算子か等価演算子かは文脈によって判断されます。
演算子 | 名称 | 説明 |
---|---|---|
> | 大なり | 左オペランドが右オペランドより大きければTrueを返します。 |
< | 小なり | 左オペランドが右オペランドより小さければTrueを返します。 |
= | 等価演算子 | 左オペランドと右オペランドが等しければTrueを返します。 |
>= | 大なりイコール | 左オペランドが右オペランド以上であればTrueを返します。 |
<= | 小なりイコール | 左オペランドが右オペランド以下であればTrueを返します。 |
<> | 不等価演算子 | 左オペランドと右オペランドが一致しなければTrueを返します。 |
論理演算子
真(True)、偽(False)の二値からなる真偽値に対して演算を行います。
演算子 | 名称 | 説明 |
---|---|---|
AND | 論理積 | 両オペランドがTrueのときに1を返します。 |
OR | 論理和 | 片方のオペランドがTrueならば1を返します。 |
XOR | 排他的論理和 | オペランドのどちらか一方がTrueのときに1を返します。 |
! | 論理否定演算子 | オペランドがFalseのときTrue、TrueのときFalseを返します。 |
AND(論理積)
論理積とは、与えられた条件がすべて真のとき真を返します。論理積の記号は「\(\cdot\)」で表します。
\(a\) | \(b\) | \(a \cdot b\) |
---|---|---|
TRUE | TRUE | TRUE |
TRUE | FALSE | FALSE |
FALSE | TRUE | FALSE |
FALSE | FALSE | FALSE |
PRINT TRUE AND TRUE // 1
PRINT TRUE AND FALSE // 0
PRINT FALSE AND TRUE // 0
PRINT FALSE AND FALSE // 0
OR(論理和)
論理和とは、与えられた条件のうち一つでも真のとき真を返します。論理和の記号は「\(+\)」で表します。
\(a\) | \(b\) | \(a + b\) |
---|---|---|
TRUE | TRUE | TRUE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
PRINT TRUE OR TRUE // 1
PRINT TRUE OR FALSE // 1
PRINT FALSE OR TRUE // 1
PRINT FALSE OR FALSE // 0
XOR(排他的論理和)
排他的論理和とは、与えられた二つの条件のうちどちらか片方が真のとき真を返します。排他的論理和の記号は「\(\oplus\)」で表します。
\(a\) | \(b\) | \(a \oplus b\) |
---|---|---|
TRUE | TRUE | FALSE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
PRINT TRUE XOR TRUE // 0
PRINT TRUE XOR FALSE // 1
PRINT FALSE XOR TRUE // 1
PRINT FALSE XOR FALSE // 0
ビット演算子
両オペランドのビットごとの論理積・論理和・排他的論理和を求め返します。
演算子 | 名称 | 説明 |
---|---|---|
AND | 論理積 | 両オペランドの論理積を返します。 |
OR | 論理和 | 両オペランドの論理和を返します。 |
XOR | 排他的論理和 | 両オペランドの排他的論理和を返します。 |
論理演算子で使われた論理積は特定のビットが真か偽かを調べるにも使われます。PEEKCOLOR関数 (スクリプト関数)で特定の色成分を取得するときに使えます。
例えば、PEEKCOLORをBGR値で取得した値が4175219(00111111 10110101 01110011)のとき。
c AND $FFで赤成分01110011(0x73)を取得。
(c AND $FF00) / $100で緑成分10110101(0xB5)を取得。
(c AND $FF0000) / $10000で青成分00111111(0x3F)を取得。
演算子の優先順位
例えば算数で習った四則演算で以下のような足し算だけの計算式がある場合、左から順に計算していくと思います。その式中で計算(評価)する箇所を( )で囲んでいます。
\[ 1 + 2 + 5 = (1 + 2) + 5 = (3 + 5) = 8 \]このように左から順番に評価をしていき結果を求めます。
次に複数の演算子が含まれる以下のような式の場合は、足し算よりも先に掛け算を計算します。
\[ 1 + 5 \times 3 = 1 + (5 \times 3) = (1 + 15) = 16 \]算数でも以下のように1 + 5を先に計算するということはしないはずです。
\[ 1 + 5 \times 3 = (1 + 5) \times 3 = 6 * 3 = 18 \]算数で掛け算よりも先に足し算を行いたい場合、その式を( )で囲み計算する優先順位を上げます。
\[ (1 + 5) \times 3 = 6 \times 3 = 18 \]このように複数の演算子がある場合、演算子によって評価していく優先度が違い順序に決まりがあります。プログラミングでもこのようなルールがあり、これを演算子の優先順位といいます。
以下に示すのが、UWSCで使う演算子の優先順位をまとめた表です。優先順位の数値が小さい程先に評価されます。優先順位が同じ場合は式の左側から順に評価されます。
優先順位 | 演算子 | 意味 |
---|---|---|
1 | ( ) | 括弧 |
2 | ! | 論理否定 |
3 | * / MOD | 乗算 除算 剰余 |
4 | + - | 加算 減算 |
5 | > < = >= <= <> | 大きい 小さい 等しい 以上 以下 等しくない |
6 | AND | 論理積 |
7 | OR XOR | 論理和 排他的論理和 |
括弧による優先順位の変更
演算子の優先順位と異なる順序で演算を行いたい場合、括弧を使用します。より内側にある括弧の方が優先順位は高くなります。
2 + 4 * 6の場合+よりも*の方が優先順位が高いので4 * 6が先に計算されます。
PRINT 2 + 4 * 6 // 2 + (4 * 6) = 2 + 24 = 26
2 + 4を先に計算したい場合は括弧で囲み優先順位を上げます。
PRINT (2 + 4) * 6 // 6 * 6 = 36