演算子の優先順位

1つの式の中で複数の演算が行われるとき、式の各部分は一定の順序に従って評価されます。この順序を演算子の優先順位と呼びます。

優先順位が同じ場合、式の左から順に行われます。

演算子 優先順位
( ) ↑高
!
*、/、MOD
+、–
>、<、=、>=、<=、<>
AND
OR、XOR ↓低

途中式の最後の計算が算術演算子なら数値が、比較演算子ならブール値(TrueまたはFalse)が返ります。計算に使われるときTrueは1、Falseは0として扱われます。

UWSC
PRINT 2 + 6 - 4   // (2 + 6) - 4 = 8 - 4
結果
プレーンテキスト
4
UWSC
PRINT 1 + (2 < 3)   // 1 + TRUE = 1 + 1
結果
プレーンテキスト
2
UWSC
PRINT 1 + 2 < 3   // (1 + 2) < 3 = 3 < 3
結果
プレーンテキスト
False
UWSC
PRINT 2 < 3 + 1   // 2 < (3 + 1) = 2 < 4
結果
プレーンテキスト
True
UWSC
PRINT 13 MOD 4 + 3   // (13 MOD 4) + 3 = 2 + 2
結果
プレーンテキスト
4

括弧による優先順位の変更

演算子の優先順位と異なる順序で演算を行いたい場合、括弧を使用します。より内側にある括弧の方が優先順位は高くなります。

「2 + 4 * 6」の場合「+」よりも「*」の方が優先順位が高いので「4 * 6」が先に計算されます。

UWSC
PRINT 2 + 4 * 6	// 2 + (4 * 6) = 2 + 24 = 26

「2 + 4」を先に計算したい場合は括弧で囲み優先順位を上げます。

UWSC
PRINT (2 + 4) * 6	// 6 * 6 = 36

算術演算子

算術演算子は、2つ以上の数値から1つの値を計算したり、数値の符号を変換するために使います。

記法は、操作対象の中間に演算子を記述する中置記法ちゅうちきほうです。

加算演算子(+)は文字列を結合するための演算子の優先順位としても使われます。

演算子 記述例 用途
+ a + b aにbを加算した値
- a - b aからbを減算した値
* a * b aにbを乗算した値
/ a / b aからbを除算した値
MOD a MOD b aからbを除算した余り

ゼロ除算

UWSCでは0で割った結果はエラーにならず0になります。

UWSC
PRINT 5 / 0
結果
プレーンテキスト
0

MOD(剰余演算)

剰余演算は、ある数値を別の数値で除算し余りを取得する演算をします。

「被除数 MOD 除数」という書き方をします。

UWSC
dividend MOD divisor

MODを使わずに書くと以下のようにをなります。

UWSC
dividend - INT(dividend / divisor) * divisor

23を4で除算した余りを求めるには、以下のように記述します。結果は「3」です。

UWSC
PRINT 23 MOD 4

符号のありなしによる結果の違い。結果は被除数の符号と同じになります。

UWSC
PRINT 23 MOD 4
PRINT -23 MOD 4
PRINT 23 MOD -4
PRINT -23 MOD -4
結果
プレーンテキスト
3
-3
3
-3

除数が-0.5〜0.5の場合、結果はエラーになります。

比較演算子

比較演算子は、値を比較するときに利用する演算子です。結果は"真"を意味する"True"か"偽"を意味する"False"のいずれかを返します。主にIF文などの条件分岐処理を書くときの条件式で使われます。

演算子 記述例 用途
< a < b aがbよりも小さいときTrue
<= a <= b aがb以下のときTrue
> a > b aがbよりも大きいときTrue
>= a >= b aがb以上のときTrue
= a = b aとbが等しいときTrue
<> a <> b aとbが等しくないときTrue

論理演算子

論理演算またはビット演算を行います。演算の結果は倍精度浮動小数点型(Double型)です。論理演算ではTrueを「1」、Falseを「0」として扱われます。

演算子 記述例 用途
AND a AND b aとbがTrueのときTrue
OR a OR b aまたはbのいずれかもしくは両方がTrueのときTrue
XOR a XOR b aまたはbのいずれか一方がTrueのときTrue

AND(論理積)

論理積とは、与えられた条件がすべて真のとき真を返します。論理積の記号は「\(\cdot\)」で表します。

ANDの真理値表
\(a\) \(b\) \(a \cdot b\)
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE
UWSC
PRINT TRUE AND TRUE			// 1
PRINT TRUE AND FALSE		// 0
PRINT FALSE AND TRUE		// 0
PRINT FALSE AND FALSE		// 0

特定のビットが真か偽かを調べるにも使われます。PEEKCOLOR (スクリプト関数)で特定の色成分を取得するときに使えます。

例えば、PEEKCOLORをBGR値で取得した値が「4175219(00111111 10110101 01110011 )」のとき。

PEEKCOLOR 赤

「c AND $FF」で赤成分「01110011(0x73)」を取得。

PEEKCOLOR 緑

「(c AND $FF00) / $100」で緑成分「10110101(0xB5)」を取得。

PEEKCOLOR 青

「(c AND $FF0000) / $10000」で青成分「00111111(0x3F)」を取得。

OR(論理和)

論理和とは、与えられた条件のうち一つでも真のとき真を返します。論理和の記号は「\(+\)」で表します。

ORの真理値表
\(a\) \(b\) \(a + b\)
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
UWSC
PRINT TRUE OR TRUE		// 1
PRINT TRUE OR FALSE		// 1
PRINT FALSE OR TRUE		// 1
PRINT FALSE OR FALSE	// 0

XOR(排他的論理和)

排他的論理和とは、与えられた二つの条件のうちどちらか片方が真のとき真を返します。排他的論理和の記号は「\(\oplus\)」で表します。

XORの真理値表
\(a\) \(b\) \(a \oplus b\)
TRUE TRUE FALSE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
UWSC
PRINT TRUE XOR TRUE			// 0
PRINT TRUE XOR FALSE		// 1
PRINT FALSE XOR TRUE		// 1
PRINT FALSE XOR FALSE		// 0

連結演算子

文字列の連結には加算演算子(+)を使います。これは算術演算子の和を求めるときの記号と同じです。和を求めるか連結するかは、操作対象の型によって異なります。

加算演算子は、演算子の両側が数値の場合は加算、それ以外の場合は結合になります。

例えば以下の場合、左から順に処理されていくので「"12+3=" + 12」で文字列になってしまい、「12 + 3」は「15」ではなく「123」と出力されてしまいます。

UWSC
PRINT "12+3=" + 12 + 3		// ("12+3=" + 12) + 3 = 123

この場合( )を使い数値同士の加算を先に行うことで、「15」と出力されるようになります。

UWSC
PRINT "12+3=" + (12 + 3)		// 15

数値を文字列として結合したい場合は先頭に「""」を記述することで数値を文字列にできます。

以下の場合変数a,bともに数値なので、結合ではなく加算されて「51」と出力されてしまいます。

UWSC
DIM a = 45
DIM b = 6
PRINT a + b		// 51

「"" + a」で文字列になるので、「a + b」を結合して「456」と出力できます。

UWSC
DIM a = 45
DIM b = 6
PRINT "" + a + b		// ("" + a) + b = 456

UWSC
PRINT "■AND"
PRINT 100 AND 12            // 4                                     0110 0100 AND                1100 =                0100
PRINT -100 AND 12           // 12                                    1001 1100 AND                1100 =                1100
PRINT 100 AND -12           // 100                                   0110 0100 AND           1111 0100 =           0110 0100
PRINT -100 AND -12          // -108                                  1001 1100 AND           1111 0100 = 1111 1111 1001 0100
PRINT 385 AND 126           // 0                                0001 1000 0001 AND           0111 1110 =                0000
PRINT -45 AND -54           // -62                                   1101 0011 AND           1100 1010 = 1111 1111 1100 0010
PRINT -243 AND 124          // 12                                    0000 1101 AND           0111 1100 =      1111 0000 1100
PRINT 385 AND -19           // 385                         0000 0001 1000 0001 AND 1111 1111 1110 1101 =      0001 1000 0001
PRINT 12 AND -24            // 8                                          1100 AND           1110 1000 =                1000
PRINT -10 AND -8            // -16                                   1111 0110 AND           1111 1000 = 1111 1111 1111 0000
PRINT 

PRINT "■OR"
PRINT 239 OR 21            // 255                                    1110 1111 OR            0001 0101 =           1111 1111
PRINT 382 OR -14           // -2                                0001 0111 1110 OR  1111 1111 1111 0010 = 1111 1111 1111 1110
PRINT 98 OR 13             // 111
PRINT -24 OR -25           // -17                          1111 1111 1110 1000 OR  1111 1111 1110 0111 = 1111 1111 1110 1111
PRINT -128 OR -28          // -28                          1111 1111 1000 0000 OR  1111 1111 1110 0100 = 1111 1111 1110 0100
PRINT -1278 OR -128        // -126                         1111 1011 0000 0010 OR  1111 1111 1000 0000 = 1111 1111 1000 0000
PRINT 845 OR -213          // -145                              0011 0100 1101 OR  1111 1111 0010 1011 = 1111 1111 0110 1111
PRINT -84329 OR -8429      // -105     1111 1110 1011 0110 1001 0111 OR  1111 1111 1101 1111 0001 0011 = 1111 1111 1111 1111 1001 0111
PRINT 

PRINT "■XOR"
PRINT 124 XOR 24           // 100                                    0111 1100 XOR           0001 1000 =           0110 0100
PRINT 89 XOR -12           // -83                                    0101 1001 XOR           1111 0100 = 1111 1111 1010 1101
PRINT -39 XOR 35           // -6                                     1101 1001 XOR           0010 0011 = 1111 1111 1111 1010
PRINT -384 XOR -24         // 360                          1111 1110 1000 0000 XOR 1111 1111 1110 1000 =      0001 0110 1000
PRINT -5758 XOR -1231      // 4787                         1110 1001 1000 0010 XOR 1111 1011 0011 0001 = 0001 0010 1011 0011
PRINT 29843 XOR -24829     // -5232                        0111 0100 1001 0011 XOR 1001 1111 0000 0011 = 1110 1011 1001 0000