运算符
优先级从高到低排列。所有二元运算符都是左结合的:a - b - c 即 (a - b) - c。
| 级别 | 运算符 | 含义 | 操作数类型 |
|---|---|---|---|
| 1 | ( ) f(…) | 分组、内置函数调用 | |
| 2 | ! - ~(一元) | 逻辑非、取负、按位取反 | !:任意 · -:Integer/Real · ~:Integer |
| 3 | * / | 乘、除 | Integer/Real |
| 4 | + - | 加或连接、减 | Integer/Real,或 Text + Text |
| 5 | << >> | 左移、算术右移 | Integer |
| 6 | < <= > >= | 大小比较 | 两个数字,或两个 Text |
| 7 | == != | 相等比较 | 任意 |
| 8 | & | 按位与 | Integer |
| 9 | ^ | 按位异或 | Integer |
| 10 | | | 按位或 | Integer |
| 11 | && | 逻辑与(两侧总是都会求值) | 任意(按真值判断) |
| 12 | || | 逻辑或(两侧总是都会求值) | 任意(按真值判断) |
没有取模运算符(%)、乘方运算符、三元运算符(?:)或逗号运算符。
注意
&& 和 || 不会短路求值。两个操作数总是都会被求值,先左后右。即使左侧已经决定了结果,右侧的内置函数调用仍会运行;如果该调用失败,操作就会停止。请改用嵌套的 if 进行保护:
text = ClipboardGetText();
idx = StringGetIndexOf(text, ":");
// 错误:当 idx 为 -1 时,StringGetSubstring(text, -1, 5) 仍会运行并停止操作
// if (idx >= 0 && StringGetSubstring(text, idx, 5) == ":here") { ... }
// 正确:只有第一个测试成立时才会运行第二个测试
if (idx >= 0) {
if (StringGetSubstring(text, idx, 5) == ":here") UtilityPrint("found");
}
注意
按位运算符的优先级低于比较运算符(与 C 相同)。flags & 4 == 4 会被解读为 flags & (4 == 4),即 flags & true,结果为 0。请始终给掩码运算加上括号:(flags & 4) == 4 或 (flags & 4) != 0。
注意
比较不能链式书写。0 < x < 10 会被解读为 (0 < x) < 10,即将 Bool 与 Integer 比较,结果始终为 false。请写成 x > 0 && x < 10。