2.02.演算子
以下の演算子が使用可能です。
レベル1: () ! ~ + - ++ --
レベル2: * / % \
レベル3: + . -
レベル4: << < <= >>> >> > >= == !=
レベル5: & && | || ^ ?:
レベル6: , = += -= *= /= %= \= .= &= |= ^= <<= >>>= >>=
()で計算の順番を明示しなければ、レベルの小さい演算子が優先して計算されます。
レベル1の + - は符号(単項演算子)で、レベル3の + - は加減算(2項演算子)です。
(オリジナルのSPALMには \ >>> += -= *= /= %= \= .= &= |= ^= <<=
>>>= >>= はありません)
(互換モード(spmode(1))では、3項演算子(?:)の末尾にセミコロン(;)が必要です)
2.2.1.演算子の詳細
(1)レベル1の演算子
() 括弧。括弧内を先に計算します。
! 論理否定(NOT)。0なら1を、非0なら0を返します。
~ 補数。ビット反転した値を返します。
+ 正符号。正であることを示します。
- 負符号。負であることを示します。
++ インクリメント。変数に1を足します。
変数の前に書いたときは 足してから値を評価します。
変数の後に書いたときは 値を評価してから足します。
-- デクリメント。変数から1を引きます。
変数の前に書いたときは引いてから値を評価します。
変数の後に書いたときは値を評価してから引きます。
(2)レベル2の演算子
* 乗算。掛け算をします。
/ 除算。割り算をします。
% 剰余。割り算をして余りを求めます。
\ 整数除算。割り算をして結果を整数化します。
(3)レベル3の演算子
+ 加算。足し算をします。
- 減算。引き算をします。
. ドット。文字列を連結します。
(4)レベル4の演算子
== 左辺と右辺が等しければ1を、そうでなければ0を返します。
!= 左辺と右辺が異なれば1を、そうでなければ0を返します。
< 左辺が右辺より小さければ1を、そうでなければ0を返します。
<= 左辺が右辺より小さいか等しければ1を、そうでなければ0を返します。
> 左辺が右辺より大きければ1を、そうでなければ0を返します。
>= 左辺が右辺より大きいか等しければ1を、そうでなければ0を返します。
<< 左シフト。左辺を右辺の数の分だけ左にビットシフトします。
>> 右シフト(符号あり)。左辺を右辺の数の分だけ右にビットシフトします。
>>> 右シフト(符号なし)。左辺を右辺の数の分だけ右にビットシフトします。
(5)レベル5の演算子
&& 論理積(AND)。左辺と右辺の両方が非0ならば1を、そうでなければ0を返します。
左辺が0の場合、右辺は評価されません。
|| 論理和(OR)。左辺と右辺のいずれかが非0ならば1を、そうでなければ0を返します。
左辺が非0の場合、右辺は評価されません。
& ビット単位の論理積(AND)。ビットごとの論理積(AND)をとった値を返します。
| ビット単位の論理和(OR)。ビットごとの論理和(OR)をとった値を返します。
^ ビット単位の排他的論理和(XOR)。ビットごとの排他的論理和(XOR)をとった値を返します。
?: 3項演算子。式1?式2:式3 の形で記述します。
式1が非0であれば式2を評価します。式1が0であれば式3を評価します。
(互換モード(spmode(1))では、式3の末尾にセミコロン(;)が必要です)
(6)レベル6の演算子
, カンマ。括弧内で使用します。複数の式を評価して、最後の式の値を返します。
= 代入。左辺に右辺を代入します。
+= 加算代入。左辺に右辺を足したものを 左辺に代入します。
-= 減算代入。左辺から右辺を引いたものを 左辺に代入します。
*= 乗算代入。左辺に右辺を掛けたものを 左辺に代入します。
/= 除算代入。左辺を右辺で割ったものを 左辺に代入します。
%= 剰余代入。左辺を右辺で割った余りを 左辺に代入します。
\= 整数除算代入。左辺を右辺で割って整数化したものを 左辺に代入します。
.= 文字列連結代入。左辺に右辺の文字列を連結したものを 左辺に代入します。
&= ビット論理積(AND)代入。左辺と右辺のビットごとの論理積(AND)をとった値を 左辺に代入します。
|= ビット論理和(OR)代入。左辺と右辺のビットごとの論理和(OR)をとった値を 左辺に代入します。
^= ビット排他的論理和(XOR)代入。左辺と右辺のビットごとの排他的論理和(XOR)をとった値を 左辺に代入します。
<<= 左シフト代入。左辺を右辺の数の分だけ左にビットシフトした値を 左辺に代入します。
>>= 右シフト代入(符号あり)。左辺を右辺の数の分だけ右にビットシフトした値を 左辺に代入します。
>>>= 右シフト代入(符号なし)。左辺を右辺の数の分だけ右にビットシフトした値を 左辺に代入します。
(2019-4-13)