您的位置:首页 > 其它

AHK的运算符

2015-07-14 13:57 239 查看

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

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

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

<
4000
/tr>
%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 yde>
通常等价于 de>x := {base: y}de>。de>newde> 后应该跟着变量或
de>GlobalClass.NestedClassde> 形式的简单类名,还可以像 de>x := new y(z)de>
那样加上可选参数(其中 de>yde> 是变量而非函数名)。更多细节请参阅自定义对象。
++
--
前置和后置的自增/自减. 从变量中增加或减去 1 (但在 1.0.46 之前的版本中, 只有把它们放在一行中才能用;
此行中不能使用其他运算符). 运算符可以放在变量名的前面或后面. 如果放在变量名的 前面, 会立即执行运算并把结果用于后面的运算.
例如,de>Var := ++Xde> 让 X 自增后才把它的值赋给 Var。相反地, 如果运算符放在变量名的
后面, 在后面的运算使用了变量 之后 才对其进行自增运算. 例如,de>Var := X++de> 把 X
的当前值赋给 Var 后才进行自增。由于向后兼容性,仅当空变量在单独一行时运算符 ++ 和 -- 才把它们视为零;例如 de>y:=1,
++xde> 和 de>MsgBox % ++xde> 当 x 为空时结果都为空。
**. 底数和指数都可以为小数. 如果指数为负数, 即使底数和指数都为整数, 结果也会被格式化为浮点数. 因为 **
的优先级高于一元负号,所以 de>-2**2de> 的计算过程和 de>-(2**2)de> 一样且得到结果
-4。因此,要让负号的优先级高于幂运算,需要把它们包围在括号中,例如 de>(-2)**2de>。注意:不支持底数为负数且指数为分数的情况,例如
de>(-2)**0.5de>;它会产生空字符串。但 de>(-2)**2de> 和 de>(-2)**2.0de>
都是支持的。
-
!
~
& *
一元负号(-):尽管它和减运算符使用相同的符号,但一元负号仅应用于单项或子表达式,如此例中的两次演示:de>-(3
/ -x)de>。相关提示, 表达式中的任何一元正号 (+) 都会被忽略.

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

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

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

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

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

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

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

除数为零时结果为空 (空字符串).
+
-
加 (+)减 (-). 相关提示, +=-= 运算符是从变量中增加或减少值的一种简写形式.
例如,de>Var+=2de> 和 de>Var:=Var+2de> 会得到相同的结果(不过前者执行的更好)。同样地,使用 Var++、Var--、++Var 或 --Var 可以让变量增加或减小 1。
<<
>>
按位左移 (<<)右移 (>>).
用法示例:de>Value1 << Value2de>。任何浮点数在计算前会被截取成整数. 左移
(<<) 相当于把 Value1 乘以 "2 的 Value2 次幂".
右移(>>)相当于把 Value1 除以“2 的 Value2
次幂”并把结果往下取整到最近的整数;例如,de>-3>>1de> 结果为 -2。
&
^
|
按位与 (&), 按位异或 (^)按位或
(|)
. 这三个运算符中, & 优先级最高而 | 优先级最低.
任何浮点数在计算前会被截取成整数.
.连接. 句点运算符用于把两个项目组合成单个字符串 (在句点的两边至少必须有一个空格).
省略句点也可以达到相同的目的(除非表达式中有不明确的关系,例如 de>x -yde>,或在右边的项目含有前导的
++ 或 -- 运算符)。省略句点时, 合并的两个项目间应该至少有一个空格.
示例(表达式方法):de>Var := "The color is "
. FoundColorde>
示例(传统方法):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 < 10de>。要提高性能,
则要应用 求值优化. 此外, 以 AND/OR/&&/||
(或其他任何运算符) 开始的行会自动 附加到 前一行的末尾.
OR
||
这两个运算符都是 逻辑或. 例如:de>x <= 3 or x >=
10de>。要提高性能, 则要应用 求值优化.
?:三元运算符 [v1.0.46+]. 此运算符是 if-else 语句 的简写形式. 它计算左侧的条件来决定两个分支中哪个作为最终结果.
例如,de>var := x>y ? 2 : 3de>,当 x 大于 y 时保存 2 到 Var;否则保存
3。为了提高性能,只计算决定性的分支(请参阅求值优化)。
:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=

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

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

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

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

由向后兼容引起的已知限制(可能会在未来的版本中解决):1) 当 /= 为表达式中最左边的运算符并且它不是多语句表达式的一部分时,而且输入都不是浮点数时,它会执行向下舍除(在其他所有情况中,/= 会执行真除);2) 仅当 +=-=
为一行中最左边的运算符时,它们才支持日期/时间的计算;3) 运算符
+=, -= 和 *= 仅在空变量在单独一行时才把它们视为零;例如,de>y:=1,
x+=1de> 和 de>MsgBox % x-=3de> 当 x 为空时都得到空的结果。
,逗号 (多语句) [v1.0.46+].
逗号可以用来在单行中书写多个子表达式. 最常用于把多个赋值或函数调用聚集在一起. 例如:de>x:=1,
y+=2, ++index, func()de>。这样的语句按从左到右的顺序执行. 注意: 以逗号
(或其他任何运算符) 开始的行会自动 附加到 前一行的末尾. 另请参阅: 逗号的性能.

在 v1.0.46.01+, 当逗号后紧跟着变量和等号时, 则这个等号会被自动当成赋值 赋值 (:=). 例如,后面所有的都是赋值:de>x:=1, y=2,
a=b=cde>。
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:=bde>)。当越多的表达式联合成单个表达式时, 性能会持续得到提升; 例如, 把五个或十个简单的表达式联合成单个表达式速度可能提升
35%.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: