优先级相同的运算符例如乘 (*) 和除 (/) 按从左到右的顺序计算, 下面另行注明的除外. 与之相比, 低优先级的运算符例如加 (+) 在更高优先级的运算符例如 (*) 之后 计算. 例如, 3 + 2 * 2 等价于 3 + (2 * 2). 使用括号可以改变优先级, 例如: (3 + 2) * 2
除了下面注明的情况, 其他时候在数学运算中包含的任何空值 (空字符串) 都 不会 被假定为零. 作为替代, 它会被视为错误, 这将导致那部分表达式的计算结果为空字符串. 例如, 如果变量 X 为空, 那么表达式 X+1 会产生空值而不是 1.
表达式运算符 (按优先级降序排列)
%Var% | 如果表达式中的变量包围在百分号中 (例如 %Var%), 不管此变量 包含 什么内容都会被假定为另一个变量 (如果不存在这样的变量, 那么 %Var% 会被解析为空字符串) 的名称或部分名称. 这种方法常用来引用 伪数组 元素, 例如: Var := MyArray%A_Index% + 100 为了向后兼容, 注明了 "可以使用表达式" 的命令参数把百分号中的孤立名称 (例如 %Var%, 但不是 Array%i%) 当作其两边的百分号不存在一样. 通过把引号包围在括号中可以避免这种情况;例如
[AHK_L 52+]: 除了普通变量, %Var% 还可以解析为 环境变量, 剪贴板或任何的 保留/只读的变量. 在修订号 52 之前, 在这些情况中 %Var% 会被当成空字符串. |
x.y | [AHK_L 31+]: 对象访问. 从对象 x 中取值或为其存入值或调用其方法, 此处 y 是个原义值. 请参阅 对象语法. |
new | [v1.1.00+]:基于其他对象创建新对象。例如,
|
++ -- | 前置和后置的自增/自减. 从变量中增加或减去 1 (但在 1.0.46 之前的版本中, 只有把它们放在一行中才能用; 此行中不能使用其他运算符). 运算符可以放在变量名的前面或后面. 如果放在变量名的 前面, 会立即执行运算并把结果用于后面的运算. 例如,
|
** | 幂. 底数和指数都可以为小数. 如果指数为负数, 即使底数和指数都为整数, 结果也会被格式化为浮点数. 因为 ** 的优先级高于一元负号,所以
|
- ! ~ & * | 一元负号(-):尽管它和减运算符使用相同的符号,但一元负号仅应用于单项或子表达式,如此例中的两次演示:
逻辑非(!): 如果运算数为空或 0, 那么逻辑非的结果为 1, 这表示 "真". 否则, 结果为 0 (假). 例如:
按位非 (~): 此运算符对运算数按位取反. 如果运算数为浮点数, 则在计算前把它截取成整数. 如果运算数介于 0 和 4294967295 (0xffffffff) 之间, 那么它会被视为 无符号的 32 位值. 否则, 它被视为 有符号的 64 位值. 例如,
取址(&):
解除引用(*):
|
* / // | 乘 (*): 如果两个输入都为整数, 则结果为整数; 否则结果为浮点数. 真除 (/): 与 EnvDiv 不同, 即使两个输入都是整数, 真除的结果也为浮点数. 例如,
向下舍除 (//): 如果两个输入都是整数, 那么双斜线运算符使用高效的整数除法. 例如,
*= 和 /= 运算符是用变量的值乘以或除以另一个值的一种简写形式. 例如,
除数为零时结果为空 (空字符串). |
+ - | 加 (+) 和 减 (-). 相关提示, += 和 -= 运算符是从变量中增加或减少值的一种简写形式. 例如,
|
<< >> | 按位左移 (<<) 和 右移 (>>). 用法示例:
|
& ^ | | 按位与 (&), 按位异或 (^) 和 按位或 (|). 这三个运算符中, & 优先级最高而 | 优先级最低. 任何浮点数在计算前会被截取成整数. |
. | 连接. 句点运算符用于把两个项目组合成单个字符串 (在句点的两边至少必须有一个空格). 省略句点也可以达到相同的目的(除非表达式中有不明确的关系,例如
还可以用来连接子表达式. 例如:
以句点 (或其他任何运算符) 开始的行会自动 附加到 前一行的末尾. |
~= | [AHK_L 31+]: RegExMatch 的简写形式. 例如,
|
> < >= <= | 大于(>)、小于(<)、大于或等于(>=)和小于或等于(<=)。如果某个输入不是数字, 则按字母顺序比较 (加了引号的原义字符串例如 "55" 在这种情况中总是被当成是非数值的). 仅当 StringCaseSense 打开时, 比较才区分大小写. 另请参阅: Sort |
= == <> != | 等号(=)、区分大小写等于(==) 和 不等于(<> 或 !=)。运算符 != 和 <> 功能完全相同。当两个输入都是数字时,运算符 == 和 = 是一样的,当某个输入不是数字时,== 总是区分大小写,而 = 总是不区分大小写(不区分大小写的方法由 StringCaseSense 决定)。与之相比,<> 和 != 都遵循 StringCaseSense。注意: 加了引号的字符串例如 "55" 在这种情况下总是被当成非数值的. |
NOT | 逻辑非. 除了优先级较低外, 其他的与 ! 运算符相同. 例如,
|
AND && | 这两个运算符都是 逻辑与. 例如:
|
OR || | 这两个运算符都是 逻辑或. 例如:
|
?: | 三元运算符 [v1.0.46+]. 此运算符是 if-else 语句 的简写形式. 它计算左侧的条件来决定两个分支中哪个作为最终结果. 例如,
|
:= += -= *= /= //= .= |= &= ^= >>= <<= | 赋值. 对变量的内容进行运算, 然后把结果保存到同一个变量中 (但在 1.0.46 之前的版本中, 这些运算符只能在一行中最左边使用, 且仅支持前五个运算符). 最简单的赋值运算符为 冒号等号 (:=), 它把表达式的结果保存到变量中. 关于其他运算符的功能说明, 请参阅这个表格中它们的相关条目. 例如,
与其他大多数运算符不同, 赋值运算是从右往左执行的. 因此,
如果使用赋值运算的结果作为其他某些运算符的输出, 那么输入的值是变量自身. 例如,如果变量 Var 新增值后大于 50,那么表达式
需要避免语法错误或提供更直观的操作时, 会自动提升赋值运算符的优先级. 例如:
由向后兼容引起的已知限制(可能会在未来的版本中解决):1) 当 /= 为表达式中最左边的运算符并且它不是多语句表达式的一部分时,而且输入都不是浮点数时,它会执行向下舍除(在其他所有情况中,/= 会执行真除);2) 仅当 += 和 -= 为一行中最左边的运算符时,它们才支持日期/时间的计算;3) 运算符 +=, -= 和 *= 仅在空变量在单独一行时才把它们视为零;例如,
|
, | 逗号 (多语句) [v1.0.46+]. 逗号可以用来在单行中书写多个子表达式. 最常用于把多个赋值或函数调用聚集在一起. 例如:
在 v1.0.46.01+, 当逗号后紧跟着变量和等号时, 则这个等号会被自动当成赋值 赋值 (:=). 例如,后面所有的都是赋值:
|
mod() | 这些和其他内置数学函数在 这里 阐述. |
func.() | [AHK_L 48+]: 试图调用对象 func 的命名的空方法. 按照约定, 这是对象的 "默认" 方法. 如果 func 不是对象, 则调用 默认基对象. [v1.0.95+]: 如果 func 为函数名, 则调用这个命名的函数. |
F(p*) | [AHK_L 60+]: 请参阅 可变参数函数. |
x[y] | [AHK_L 31+]: 对象访问. 从对象 x 中取值或为其存入值或调用其方法, 这里的 y 是参数列表或计算方法名. 请参阅 数组语法 和 对象语法. |
性能:在 v1.0.48+,使用逗号运算符常常比分开写单独的表达式速度更快,尤其是把一个变量的值赋给另一个变量时(例如