Skip to content

运算

翻译自原文档:https://osdn.net/projects/emuera/wiki/exop

运算符

单目运算符

  • ~:按位取反(按位 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 时就会发生错误。

GPL-3.0+ Licensed