运算
运算符
单目运算符
~:按位取反(按位 NOT),单目运算符(优先级最高)!:逻辑非(NOT),单目运算符(优先级最高)
双目运算符
<<:左移。优先级高于比较和位运算,低于四则运算。>>:右移。优先级高于比较和位运算,低于四则运算。^:按位异或(按位 XOR)。优先级与&、|相同。^^:逻辑异或(XOR)。优先级与&&、||相同。!&:逻辑与非(NAND)。优先级与&&、||相同。!|:逻辑或非(NOR)。优先级与&&、||相同。
三元运算符
?~#:普通的三元运算符。优先级位于 = 之下、其余运算符之上(会先汇总判断与结果,再进行运算)。
erb
书写格式(数值):<赋值目标变量> = <条件式> ? <为真时的值> # <为假时的值>
书写格式(字符串):<赋值目标变量> = \@<条件式> ? <为真时的值> # <为假时的值>\@在处理的含义上等同于:
erb
IF <条件式>
<赋值目标变量> = <为真时的值>
ELSE
<赋值目标变量> = <为假时的值>
ENDIF另外,数值的三元运算符放进 () 中就可以在普通计算中使用;字符串的三元运算符可以直接用于 PRINTFORM 系指令。但是,\@~\@ 形式的三元运算符不能省略 #。
赋值运算符
'=:使用字符串表达式向字符串型变量赋值的运算符,详见此处。
递增与递减
++:自增--:自减
用于代替赋值语句,不能与其他运算符组合使用。
暂定的运算符优先级表
| 分类 | 优先级 | 赋值复合运算 | 符号 |
|---|---|---|---|
| 否定运算符 | 高 | × | ~, ! |
| 算术运算符 | ↑ | ○ | *, /, % |
| ○ | +, - | ||
| 位移运算符 | ○ | <<, >> | |
| 比较运算符 | × | <, >, <=, >= | |
| × | ==, != | ||
| 逻辑运算符 | ○ | &, ` | |
| ↓ | × | &&, !&, ` | |
| 三元运算符 | 低 | × | ~?…#_ |
新增的运算
==:字符串与字符串的比较。不能将数值与字符串进行比较。!=:字符串与字符串的比较。<:字符串与字符串的比较。比较从开头进行,在发现不同字符的位置即确定结果。>:字符串与字符串的比较。<=:字符串与字符串的比较。>=:字符串与字符串的比较。+:字符串与字符串的连接。数值与字符串不能相加或连接。*:字符串与整数的乘法。字符串与字符串不能相乘。
erb
STR:0 = % "あ" * 10 %
PRINTFORML STR:0 = "%STR:0%"
WAIT结果:
STR:0 = "ああああああああああ"逻辑运算符的短路求值
短路求值是指,例如在 X && Y 这样的表达式中,当 X 为 0 时,无论 Y 的值如何,运算结果都显然是 0,因此不再对 Y 求值。
包括吉里吉里在内的许多语言都会对逻辑运算符进行短路求值。
利用这种求值方式可以这样书写:
erb
IF (ASSI >= 0) && (NO:ASSI == 1)
~~~
ELSE
~~~
ENDIF当 ASSI 为 0 或更小时,无论 (NO:ASSI == 1) 的结果如何,整体结果都是 0,因此不会引用 NO:ASSI,也就不会发生错误。
求值顺序是先左项、后右项。
erb
IF (NO:ASSI == 1) && (ASSI >= 0)这样书写时会先计算 (NO:ASSI == 1),因此当 ASSI < 0 时就会发生错误。