AHK的运算符

优先级相同的运算符例如乘 (*) 和除 (/) 按从左到右的顺序计算, 下面另行注明的除外. 与之相比, 低优先级的运算符例如加 (+) 在更高优先级的运算符例如 (*) 之后 计算. 例如, 3 + 2 * 2 等价于 3 + (2 * 2). 使用括号可以改变优先级, 例如: (3 + 2) * 2

除了下面注明的情况, 其他时候在数学运算中包含的任何空值 (空字符串) 都 不会 被假定为零. 作为替代, 它会被视为错误, 这将导致那部分表达式的计算结果为空字符串. 例如, 如果变量 X 为空, 那么表达式 X+1 会产生空值而不是 1.

表达式运算符 (按优先级降序排列)

%Var%

如果表达式中的变量包围在百分号中 (例如 %Var%), 不管此变量 包含 什么内容都会被假定为另一个变量 (如果不存在这样的变量, 那么 %Var% 会被解析为空字符串) 的名称或部分名称. 这种方法常用来引用 伪数组 元素, 例如:

Var := MyArray%A_Index% + 100

为了向后兼容, 注明了 "可以使用表达式" 的命令参数把百分号中的孤立名称 (例如 %Var%, 但不是 Array%i%) 当作其两边的百分号不存在一样. 通过把引号包围在括号中可以避免这种情况;例如 de>Sleep (%Var%) de>。

[AHK_L 52+]: 除了普通变量, %Var% 还可以解析为 环境变量, 剪贴板或任何的 保留/只读的变量. 在修订号 52 之前, 在这些情况中 %Var% 会被当成空字符串.

x.y[AHK_L 31+]: 对象访问. 从对象 x 中取值或为其存入值或调用其方法, 此处 y 是个原义值. 请参阅 对象语法.
new[v1.1.00+]:基于其他对象创建新对象。例如, de>x := new y de> 通常等价于 de>x := {base: y} de>。 de>new de> 后应该跟着变量或 de>GlobalClass.NestedClass de> 形式的简单类名,还可以像 de>x := new y(z) de> 那样加上可选参数(其中 de>y de> 是变量而非函数名)。更多细节请参阅 自定义对象
++
--
前置和后置的自增/自减. 从变量中增加或减去 1 (但在 1.0.46 之前的版本中, 只有把它们放在一行中才能用; 此行中不能使用其他运算符). 运算符可以放在变量名的前面或后面. 如果放在变量名的 前面, 会立即执行运算并把结果用于后面的运算. 例如, de>Var := ++X de> 让 X 自增后才把它的值赋给 Var。相反地, 如果运算符放在变量名的 后面, 在后面的运算使用了变量 之后 才对其进行自增运算. 例如, de>Var := X++ de> 把 X 的当前值赋给 Var 后才进行自增。由于向后兼容性,仅当空变量在单独一行时运算符 ++ 和 -- 才把它们视为零;例如 de>y:=1, ++x de> 和 de>MsgBox % ++x de> 当 x 为空时结果都为空。
**. 底数和指数都可以为小数. 如果指数为负数, 即使底数和指数都为整数, 结果也会被格式化为浮点数. 因为 ** 的优先级高于一元负号,所以 de>-2**2 de> 的计算过程和 de>-(2**2) de> 一样且得到结果 -4。因此,要让负号的优先级高于幂运算,需要把它们包围在括号中,例如 de>(-2)**2 de>。注意:不支持底数为负数且指数为分数的情况,例如 de>(-2)**0.5 de>;它会产生空字符串。但 de>(-2)**2 de> 和 de>(-2)**2.0 de> 都是支持的。
-
!
~
& *

一元负号(-):尽管它和减运算符使用相同的符号,但一元负号仅应用于单项或子表达式,如此例中的两次演示: de> -(3 / -x) de>。相关提示, 表达式中的任何一元正号 (+) 都会被忽略.

逻辑非(!): 如果运算数为空或 0, 那么逻辑非的结果为 1, 这表示 "真". 否则, 结果为 0 (假). 例如: de>!x or !(y and z) de>。注意: 单词 NOT 和 ! 含义相同, 但 ! 优先级更高. 在 v1.0.46+,允许使用连续的一元运算符,例如 de> !!Var de>,因为它们是按从右到左的顺序计算。

按位非 (~): 此运算符对运算数按位取反. 如果运算数为浮点数, 则在计算前把它截取成整数. 如果运算数介于 0 和 4294967295 (0xffffffff) 之间, 那么它会被视为 无符号的 32 位值. 否则, 它被视为 有符号的 64 位值. 例如, de>~0xf0f de> 计算结果为 0xfffff0f0(4294963440)。

取址(&)de>&MyVar de> 获取 MyVar 的内容的内存地址,此地址一般和 DllCall 结构一起使用。同时 de>&MyVar de> 也禁用了此变量中的二进制数的缓存,如果它经常用于数学或数值比较,那么这会拖慢其性能。每当变量的地址改变时会重新启用它的缓存 (例如使用 VarSetCapacity()).

解除引用(*)de>*Expr ession de> 假定 de>Expr ession de> 解析为数值的内存地址;它会获取在一个介于 0 和 255 之间的数字表示的内存地址中一个字节的内容(地址为 0 时获取的结果也总是 0;但应该避免使用其他任何无效地址,因为它可能会让脚本崩溃)。然而, 使用 NumGet() 获取二进制数通常会更好.

*
/
//

乘 (*): 如果两个输入都为整数, 则结果为整数; 否则结果为浮点数.

真除 (/): 与 EnvDiv 不同, 即使两个输入都是整数, 真除的结果也为浮点数. 例如, de>3/2 de> 结果为 1.5 而不是 1,而 de>4/2 de> 结果为 2.0 而不是 2。

向下舍除 (//): 如果两个输入都是整数, 那么双斜线运算符使用高效的整数除法. 例如, de>5//3 de> 结果为 1 而 de>5//-3 de> 结果为 -1。如果任何一个输入为浮点数, 则执行浮点除法并把结果往下取整到最近的整数. 例如, de>5//3.0 de> 结果为 1.0 而 de>5.0//-3 de> 结果为 -2.0。尽管浮点除法的结果为整数, 但它被保存为浮点格式, 以便其他使用者能使用浮点格式. 关于求模运算,请参阅 mod()

*=/= 运算符是用变量的值乘以或除以另一个值的一种简写形式. 例如, de>Var*=2 de> 和 de>Var:=Var*2 de> 会得到相同的结果(不过前者执行的更好)。

除数为零时结果为空 (空字符串).

+
-

加 (+)减 (-). 相关提示, +=-= 运算符是从变量中增加或减少值的一种简写形式. 例如, de>Var+=2 de> 和 de>Var:=Var+2 de> 会得到相同的结果(不过前者执行的更好)。同样地,使用 Var++、Var--、++Var 或 --Var 可以让变量增加或减小 1。

<<
>>
按位左移 (<<)右移 (>>). 用法示例: de>Value1 << Value2 de>。任何浮点数在计算前会被截取成整数. 左移 ( <<) 相当于把 Value1 乘以 "2 的 Value2 次幂". 右移( >>)相当于把 Value1 除以“2 的 Value2 次幂”并把结果往下取整到最近的整数;例如, de>-3>>1 de> 结果为 -2。
&
^
|
按位与 (&), 按位异或 (^)按位或 (|). 这三个运算符中, & 优先级最高而 | 优先级最低. 任何浮点数在计算前会被截取成整数.
.

连接. 句点运算符用于把两个项目组合成单个字符串 (在句点的两边至少必须有一个空格). 省略句点也可以达到相同的目的(除非表达式中有不明确的关系,例如 de>x -y de>,或在右边的项目含有前导的 ++ 或 -- 运算符)。省略句点时, 合并的两个项目间应该至少有一个空格.
示例(表达式方法): de>Var := "The color is " . FoundColor de>
示例(传统方法): de>Var = The color is %FoundColor% de>

还可以用来连接子表达式. 例如: de>Var := "The net price is " . Price * (1 - Discount/100) de>。

以句点 (或其他任何运算符) 开始的行会自动 附加到 前一行的末尾.

~=[AHK_L 31+]: RegExMatch 的简写形式. 例如, de>"abc123" ~= "\d" de> 会设置 ErrorLevel 为 0 并得到结果 4(首个数字的位置)。在 v1.1.03 之前, 此运算符和 等号 (=) 运算符优先级相同, 却完全没有说明.
>   <
>= <=
大于(>)小于(<)大于或等于(>=)小于或等于(<=)。如果某个输入不是数字, 则按字母顺序比较 (加了引号的原义字符串例如 "55" 在这种情况中总是被当成是非数值的). 仅当 StringCaseSense 打开时, 比较才区分大小写. 另请参阅: Sort
=
==
<> !=
等号(=)区分大小写等于(==)不等于(<> 或 !=)。运算符 !=<> 功能完全相同。当两个输入都是数字时,运算符 === 是一样的,当某个输入不是数字时,== 总是区分大小写,而 = 总是不区分大小写(不区分大小写的方法由 StringCaseSense 决定)。与之相比,<>!= 都遵循 StringCaseSense。注意: 加了引号的字符串例如 "55" 在这种情况下总是被当成非数值的.
NOT逻辑非. 除了优先级较低外, 其他的与 ! 运算符相同. 例如, de>not (x = 3 or y = 3) de> 等同于 de> !(x = 3 or y = 3) de>。
AND
&&
这两个运算符都是 逻辑与. 例如: de>x > 3 and x < 10 de>。要提高性能, 则要应用 求值优化. 此外, 以 AND/OR/&&/|| (或其他任何运算符) 开始的行会自动 附加到 前一行的末尾.
OR
||
这两个运算符都是 逻辑或. 例如: de>x <= 3 or x >= 10 de>。要提高性能, 则要应用 求值优化.
?:三元运算符 [v1.0.46+]. 此运算符是 if-else 语句 的简写形式. 它计算左侧的条件来决定两个分支中哪个作为最终结果. 例如, de>var := x>y ? 2 : 3 de>,当 x 大于 y 时保存 2 到 Var;否则保存 3。为了提高性能,只计算决定性的分支(请参阅 求值优化)。
:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=

赋值. 对变量的内容进行运算, 然后把结果保存到同一个变量中 (但在 1.0.46 之前的版本中, 这些运算符只能在一行中最左边使用, 且仅支持前五个运算符). 最简单的赋值运算符为 冒号等号 (:=), 它把表达式的结果保存到变量中. 关于其他运算符的功能说明, 请参阅这个表格中它们的相关条目. 例如, de>Var //= 2 de> 执行向下舍除,把 Var 除以 2,然后把结果保存回 Var。同样地, de>Var .= "abc" de> 为 de>Var := Var . "abc" de> 的一种简写形式。

与其他大多数运算符不同, 赋值运算是从右往左执行的. 因此, de>Var1 := Var2 := 0 de> 这个语句中首先把 0 赋值给 Var2,然后把 Var2 赋值给 Var1

如果使用赋值运算的结果作为其他某些运算符的输出, 那么输入的值是变量自身. 例如,如果变量 Var 新增值后大于 50,那么表达式 de>(Var+=2) > 50 de> 结果为真。这样还允许赋值被作为 ByRef 传递或获取它的地址,例如: de>&(x:="abc") de>。

需要避免语法错误或提供更直观的操作时, 会自动提升赋值运算符的优先级. 例如: de>not x:=y de> 等价于 de>not (x:=y) de>。同样地, de>++Var := X de> 等价于 de>++(Var := X) de>;而 de>Z>0 ? X:=2 : Y:=2 de> 等价于 de>Z>0 ? (X:=2) : (Y:=2) de>。

由向后兼容引起的已知限制(可能会在未来的版本中解决):1) 当 /= 为表达式中最左边的运算符并且它不是多语句表达式的一部分时,而且输入都不是浮点数时,它会执行向下舍除(在其他所有情况中,/= 会执行真除);2) 仅当 +=-= 为一行中最左边的运算符时,它们才支持日期/时间的计算;3) 运算符 +=, -= 和 *= 仅在空变量在单独一行时才把它们视为零;例如, de>y:=1, x+=1 de> 和 de>MsgBox % x-=3 de> 当 x 为空时都得到空的结果。

,

逗号 (多语句) [v1.0.46+]. 逗号可以用来在单行中书写多个子表达式. 最常用于把多个赋值或函数调用聚集在一起. 例如: de>x:=1 , y+=2 , ++index, func() de>。这样的语句按从左到右的顺序执行. 注意: 以逗号 (或其他任何运算符) 开始的行会自动 附加到 前一行的末尾. 另请参阅: 逗号的性能.

在 v1.0.46.01+, 当逗号后紧跟着变量和等号时, 则这个等号会被自动当成赋值 赋值 (:=). 例如,后面所有的都是赋值: de>x:=1, y=2, a=b=c de>。

mod()
round()
abs()

这些和其他内置数学函数在 这里 阐述.
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+,使用逗号运算符常常比分开写单独的表达式速度更快,尤其是把一个变量的值赋给另一个变量时(例如 de>x:=y, a:=b de>)。当越多的表达式联合成单个表达式时, 性能会持续得到提升; 例如, 把五个或十个简单的表达式联合成单个表达式速度可能提升 35%.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值