世界杯欧洲区预选赛_世界杯足球几年一次 - chinaacecloud.com



变量和表达式

运算符

描述

%Expr%

解引用或名称替换.

当 Expr 计算为 VarRef 时, %Expr% 访问相应的变量. 例如, x := &y 取 y 的引用并将其赋值给 x, 那么 %x% := 1 赋值给变量 y, 而 %x% 读取其值.

否则, 子表达式 Expr 的值被用作变量或属性的名称或部分名称. 这使得脚本可以引用一个变量或属性, 其名称是由计算 Expr 确定的, 它通常是另一个变量. 变量不能被动态创建, 但是如果一个变量已经在脚本中的某个地方被声明或被非动态引用, 那么它可以被动态赋值.

注意: 子表达式 Expr 的 结果 必须是要访问的变量或属性的名称或部分名称.

由于存在歧义, 百分号不能直接在 Expr 中使用, 但可以在括号中嵌套. 否则, Expr 可以是任何表达式.

如果有任何相邻的 %Expr% 序列和部分名称(它们之间没有任何空格或其他字符), 则将它们组合成一个单一的名称.

如果变量并不存在, 或者它未初始化并且它的值正在被读取, 则通常抛出一个 Error. 可以使用 or-maybe 运算符(??) 通过提供默认值来避免这种情况. 例如: %'novar'% ?? 42.

虽然这在历史上被称为 "双重解引", 但当 Expr 不包含一个变量(第一重解引), 以及当产生的变量是赋值的目标, 而不是解引用(第二重解引), 这个术语是不准确的.

x.yx.%z%

成员访问. 获取, 设置或调用对象 x 的属性, 其中 y 是个原义名称, 而 z 是一个计算结果为名称的表达式. 有关详情, 请参阅 对象语法.

var?

Maybe. 允许未设置的变量. 这只在将变量传递给可选参数, 数组元素或文本对象; 或直接赋值的右边时有效. 问号后面必须跟随下列符号之一(忽略空白): )]},:. 变量可以通过三元运算符或在 AND/OR 的右边有条件地传递.

变量通常是一个可选参数, 但可以是任何变量. 对于不是函数参数的变量, 如果有对该变量的其他引用但没有赋值, 在加载时仍然可能显示 VarUnset 警告.

该操作符目前仅支持变量. 要在更一般的情况下显式或有条件地省略参数, 请使用 unset 关键字.

另请参阅: unset(可选参数)

++

--

前置和后置的自增/自减. 从变量中增加或减去 1. 运算符可以放在变量名的前面或后面. 如果放在变量名的 前面, 则执行自增/减运算并把结果用于下一运算(在这种情况下结果是一个变量引用). 例如, Var := ++X 递增 X 然后将其值赋给 Var. 相反, 如果运算符放在变量名的 后面, 结果是在执行运算之前的 X 值. 例如, Var := X++ 递增 X, 但 Var 接收 X 在递增之前的值.

这些运算符还可以与对象的属性一起使用, 如 myArray.Length++ 或 --myArray[i]. 在这些情况下, 子表达式的结果总是一个数字, 而不是一个变量引用.

**

幂. 示例用法: Base**Exponent. 底数(Base) 和指数(Exponent) 都可以为小数. 如果 指数 为负数, 即使 底数 和 指数 都为整数, 结果也会被格式化为浮点数. 因为 ** 的优先级高于一元负号, 所以, -2**2 的计算过程和 -(2**2) 一样, 且得到结果 -4. 因此, 要计算原义负数的幂, 需要把它们包围在括号中, 如 (-2)**2.

幂运算符是右结合的. 例如, x ** y ** z 计算为 x ** (y ** z).

注意: 不支持 底数 为负数且 指数 为小数的情况, 如 (-2)**0.5; 尝试它将导致抛出异常. 但 (-2)**2 和 (-2)**2.0 都是支持的. 如果 底数 和 指数 都为 0, 结果未定义并抛出异常.

-

!

~

&

一元负号(-): 反转其运算元的符号.

一元正号(+): +N 等同于 -(-N). 应用于纯数字时无效, 但可用于将数字字符串转换为纯数字.

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

按位非(~): 此运算符对运算元按位取反. 当使用 64 位有符号整数时, 正的输入值始终给出负的结果, 反之亦然. 例如, ~0xf0f 等于 -0xf10(-3856), 二进制等于 0xfffffffffffff0f0. 如果希望使用无符号的 32 位值, 可以使用 result & 0xffffffff 截断结果. 如果操作数是一个浮点值, 则抛出 TypeError.

引用(&): 创建一个 VarRef, 它是一个代表变量引用的值. VarRef 可以用来间接访问目标变量. 例如, ref := &target 接着的 %ref% := 1 将把值 1 赋值给 target. VarRef 通常会被传递给一个函数, 但也可以存储在一个数组或属性中. 另请参阅: Dereference, ByRef.

目前不支持对内置变量(如 A_Clipboard) 的引用, 除非是直接传递给内置函数的 OutputVar 参数.

*

/

//

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

其他用途: 星号(*) 运算符也用于可变参数函数调用.

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

整数除法(//): 如果两个输入都是整数, 那么双斜杠运算符使用高效的整数除法. 例如, 5//3 结果为 1 而 5//-3 结果为 -1. 如果任何一个输入为浮点格式, 则抛出 TypeError. 有关取模, 请参阅 Mod.

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

除数为零, 则导致抛出 ZeroDivisionError.

+

-

加(+) 和 减(-). 在相关的注释中, += 和 -= 运算符是变量增加或减少的一种简写形式. 例如, Var+=2 和 Var:=Var+2 会得到相同的结果(不过前者执行的更好). 类似地, 变量可以通过使用 Var++, Var--, ++Var 或 --Var 来增加或减少 1.

其他用途: 如果 + 或 - 符号前面没有一个值(或生成值的子表达式), 则将其解释为一元运算符.

<<

>>

>>>

按位左移(<<). 使用示例: Value1 << Value2. 这相当于 Value1 乘以 "2 的 Value2 次幂".

算术位右移(>>). 使用示例: Value1 >> Value2. 这相当于 Value1 除以 "2 的 Value2 次幂" 并将结果四舍五入到数轴左侧最接近的整数; 例如, -3>>1 结果为 -2.

逻辑位右移(>>>). 使用示例: Value1 >>> Value2. 与算术位右移不同, 这并不保留数字的符号. 例如, -1 与无符号的 64 位整数 0xffffffffffffffff 拥有相同的位表示, 因此 -1 >>> 1 结果为 0x7fffffffffffffff.

下面的内容适用于这三个运算符:

如果任何一个输入是浮点数, 则抛出 TypeError.

执行 64 位运算, 结果为 64 位有符号整数.

如果 Value2 小于 0 或大于 63, 则抛出异常.

&

^

|

按位与(&), 按位异或(^) 和 按位或(|). 这三个运算符中, & 优先级最高, 而 | 优先级最低.

下面的内容适用于这三个运算符:

如果其中一个输入是浮点数, 则抛出 TypeError.

执行 64 位运算, 结果为 64 位有符号整数.

相关: 按位非(~)

.

连接. 每边至少有一个空格或制表符的句点(点) 用于将两个项组合成单个字符串. 您还可以省略句点以获得相同的结果(除非有歧义, 如 x -y, 或者右边的项有一个前导的 ++ 或 --). 当省略点时, 要合并的项之间必须至少有一个空格或制表符.

Var := "The color is " . FoundColor ; 显式连接

Var := "The color is " FoundColor ; 自动连接

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

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

每个输入的整个长度会被使用, 即使它包含二进制零. 例如, Chr(0x2010) Chr(0x0000) Chr(0x4030) 生成以下字节的字符串(由于 UTF-16-LE 编码): 0x10, 0x20, 0, 0, 0x30, 0x40. 结果有一个额外的空结束符(二进制零), 它不包含在长度中.

其他用途: 如果句点右侧没有空格或制表符, 则将其解释为原义浮点数或成员访问. 例如, 1.1 和 (.5) 是数字, A_Args.Has(3) 方法调用, 而 A_Args.Length 是一个属性访问.

~=

RegExMatch 的简写形式. 例如, "abc123" ~= "\d" 结果为 4(首个数字字符串的位置).

> <

>= <=

大于(>), 小于(<), 大于或等于(>=) 和 小于或等于(<=). 输入的数据是以数字方式进行比较的. 如果其中一个输入不是数字或数字字符串, 则抛出 TypeError.

=

==

!=

!==

不区分大小写的等号(=) / 不等号(!=) 和 区分大小写的等号(==) / 不等号(!==). 运算符 == 的行为和 = 是一样的, 除非其中一个输入不是数字(或都是字符串), 在这种情况下 == 总是区分大小写的, 而 = 总是不区分大小写的. != 和 !== 与其对应的没有 ! 的运算符是一样的, 只是其结果取反.

== 和 !== 运算符可用于比较包含二进制零的字符串. 除了 ~= 之外的所有其他比较运算符仅比较到第一个二进制零.

对于不区分大小写的比较, 只有 ASCII 字母 A-Z 才会被认为等同于它们的小写字母. 如果要根据当前用户区域规则进行比较, 请使用 StrCompare 并为 CaseSense 参数指定 "Locale".

ISINCONTAINS

如果 Value 是 Class 的实例, 那么 Value is Class 结果为 1(true), 否则为 0(false). Class 必须是一个对象, 并具有自有 Prototype 属性, 但通常该属性是由类定义隐式定义的. 这个操作一般等同于 HasBase(Value, Class.Prototype).

in 和 contains 保留给将来使用.

NOT

逻辑非. 除了优先级较低外, 其他的与 ! 运算符相同. 例如, not (x = 3 or y = 3) 等同于 !(x = 3 or y = 3).

AND

&&

这两个运算符都是逻辑与. 例如: x > 3 and x < 10.

在表达式中, 所有运算元都为 true, 则返回 最后的 运算元. 否则, 返回 第一个 为 false 的运算元. 换句话说, 只有当所有运算元都为 true 时, 结果才为 true. 布尔表达式需要进行求值优化(从左到右) 以提高性能.

在下面的例子中, 所有运算元都为真, 并都要进行计算:

A := 1, B := {}, C := 20, D := true, E := "str"

MsgBox(A && B && C && D && E) ; 显示 "str"(E).

在下面的例子中, 因为 B 为假, 所以只计算前两个运算元. 其余部分被忽略, 即 C 不递增:

A := 1, B := "", C := 0, D := false, E := "str"

MsgBox(A && B && ++C && D && E) ; 显示 ""(B).

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

OR

||

这两个运算符都是逻辑或. 例如: x <= 3 or x >= 10.

在表达式中, 至少有一个运算元为 true, 则返回 第一个 为 true 的运算元. 否则, 返回 最后一个 为 false 的运算元. 换句话说, 只要有一个运算元为真, 结果就为真. 布尔表达式需要进行求值优化(从左到右) 以提高性能.

在下面的示例中, 至少有一个运算元为真. 直到 D(包括) 的所有运算元都要进行计算. E 被忽略, 并始终不会自增:

A := "", B := false, C := 0, D := "str", E := 20

MsgBox(A || B || C || D || ++E) ; 显示 "str"(D).

在下面的例子中, 所有运算元都为假, 并都要进行计算:

A := "", B := false, C := 0

MsgBox(A || B || C) ; 显示 "0"(C).

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

??

Or maybe, 也称为合并运算符. 如果左操作数(必须是一个变量) 有一个值, 它就成为结果, 并跳过右分支. 否则, 右操作数将成为结果. 换句话说, A ?? B 的行为类似于 A || B (逻辑或), 除了条件是 IsSet(A).

这通常用于在已知变量或可选参数可能还没有值时提供默认值. 例如:

MsgBox MyVar ?? "Default value"

由于期望变量有时未初始化, 因此在这种情况下不会抛出错误. 与 IsSet(A) ? A : B 不同的是, 如果变量有其他引用但没有赋值, VarUnset 警告仍然可以在加载时显示.

?:

三元运算符. 此运算符是 if-else 语句的简写形式. 它计算左侧的条件来决定两个分支中哪个作为最终结果. 例如, var := x>y ? 2 : 3, 当 x 大于 y 时保存 2 到 Var; 否则保存 3. 为了提高性能, 只计算决定性的分支(请参阅求值优化).

另请参阅: maybe(var?), or-maybe(??)

注意: 当在行的开头使用时, 三元条件通常应该用括号括起来, 以减少与其他类型语句的歧义. 有关详情, 请参阅表达式语句.

:=

+=

-=

*=

/=

//=

.=

|=

&=

^=

>>=

<<=

>>>=

赋值. 对变量的内容进行运算, 然后把结果保存到同一个变量中. 最简单的赋值运算符为冒号等号(:=), 它把表达式的结果保存到变量中. 关于其他运算符的功能说明, 请参阅这个表格中它们的相关条目. 例如, Var //= 2 执行整数除法把 Var 除以 2, 然后把结果保存回 Var. 类似的, Var .= "abc" 为 Var := Var . "abc" 的一种简写形式.

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

如果赋值作为某些其他运算符的输入, 它的值是变量本身. 例如, 如果 Var 的新增值大于 50, 表达式 (Var+=2) > 50 为真. 将赋值与引用操作符结合起来也是有效的, 如 &(Var := "initial value").

需要避免语法错误或提供更直观的操作时, 会自动提升赋值运算符的优先级. 另外, x==y && z:=1 计算为 x==y && (z:=1), 当 x 不等于 y 时进行短路计算. 例如: not x:=y 等同于 not (x:=y). 类似的, ++Var := X 等同于 ++(Var := X); 而 Z>0 ? X:=2 : Y:=2 等同于 Z>0 ? (X:=2) : (Y:=2).

目标变量可以通过将直接赋值(:=) 与 unset 关键字或 maybe(var?) 运算符联合使用来 un-set(取消设置). 例如: Var := unset, Var1 := (Var2?).

赋值还可以针对对象的属性, 如 myArray.Length += n 或 myArray[i] .= t. 当赋值给一个属性时, 子表达式的结果是赋值的值, 而不是变量引用.

() => expr

胖箭头函数. 定义一个简单的函数并返回一个 Func 或闭包对象. 将函数的参数列表(可以在前面加上函数名) 写在操作符的左边. 当函数被调用时(通过返回的引用), 它计算子表达式 expr 并返回结果.

下面两个例子是等价的:

sumfn := Sum(a, b) => a + b

Sum(a, b) {

return a + b

}

sumfn := Sum

在这两种情况下, 函数都是在脚本启动时无条件定义的, 但是函数引用只有在赋值时才存储在 sumfn 中.

如果函数名被省略, 而参数列表只包含一个参数名, 则可以省略圆括号. 下面的例子定义了一个带有一个参数 a 的匿名函数, 并将其引用存储在变量 double 中:

double := a => a * 2

expr 中的变量引用的解析方法与完整函数定义中的方法相同. 例如, expr 可以引用 outer 函数的局部变量(就像在任何嵌套函数中一样), 在这种情况下, 每当计算胖箭头表达式时, 都会创建一个新的闭包并返回它. 因为不能使用声明, 所以该函数总是假定-局部的.

为函数指定名称允许递归地调用它或由其他嵌套函数调用它, 而无需在其内部存储对闭包的引用(从而创建有问题的循环引用). 它还有助于调试, 比如 Func.Name 或显示在调试器的调用堆栈上.

胖箭头语法也可以用来定义简写的属性和方法.

,

逗号(多语句). 逗号可以用来在单行中书写多个子表达式. 最常用于把多个赋值或函数调用聚集在一起. 例如: x:=1, y+=2, ++index, MyFunc(). 这样的语句按从左到右的顺序执行.

注意: 以逗号(或其他任何运算符) 开始的行会自动附加到上一行的末尾.

逗号还用于分隔函数调用的或控制流语句的参数. 若要在参数列表中包含多语句表达式, 请用一组额外的圆括号将其括起来. 例如, MyFn((x, y)) 计算 x 和 y, 但传递 y 作为 MyFn 的第一个也是唯一一个参数.