04 - 运算符
2026/7/16大约 3 分钟
04 - 运算符
算术运算符
#Requires AutoHotkey v2.0
a := 10
b := 3
result := a + b ; 加法 → 13
result := a - b ; 减法 → 7
result := a * b ; 乘法 → 30
result := a / b ; 除法 → 3.333...
result := a // b ; 整除 → 3(向下取整)
result := a ** b ; 幂运算 → 1000(10 的 3 次方)
result := a % b ; 取模 → 1(10 mod 3)
; 自增自减
n := 5
n++ ; n = 6(后置自增)
n-- ; n = 5(后置自减)
n += 10 ; n = 15(加赋值)
n -= 5 ; n = 10(减赋值)
n *= 2 ; n = 20(乘赋值)
n /= 4 ; n = 5(除赋值)
n //= 3 ; n = 1(整除赋值)
n .= "号" ; n = "1号"(字符串拼接赋值)
整除 vs 除法
; // 整除:向负无穷取整
MsgBox 7 // 2 ; 3
MsgBox -7 // 2 ; -4(注意不是 -3!)
MsgBox 7.0 // 2 ; 3.0
; / 除法:总是返回浮点数
MsgBox 7 / 2 ; 3.5
MsgBox 6 / 2 ; 3.0(也是浮点数)
比较运算符
5 == 5 ; true — 等于(区分大小写)
5 != 5 ; false — 不等于(区分大小写)
"abc" = "ABC" ; true — 不区分大小写的字符串比较
"abc" != "ABC" ; false — 不区分大小写
"abc" == "ABC" ; false — 区分大小写的字符串比较
"abc" !== "ABC" ; true — 区分大小写
5 > 3 ; true — 大于
5 < 3 ; false — 小于
5 >= 5 ; true — 大于等于
5 <= 4 ; false — 小于等于
关键区别:
= / !=不区分大小写,== / !==区分大小写。比较数字时两者行为相同。
比较的行为细节
; 数字比较 — 数值比较
MsgBox 5 > 3 ; true
MsgBox "5" > "3" ; true(字符串中的数字仍按数值比较)
; 纯字符串比较 — 按字母序
MsgBox "abc" > "abb" ; true(字母序比较)
MsgBox "abc" > "ABC" ; true(不区分大小写字母序)
; 混合比较 — 数字优先
MsgBox "10" > "9" ; true(按数值比较)
MsgBox "a10" > "a9" ; true(混合字符串也按数值部分比较)
逻辑运算符
true && true ; true — 逻辑与
true && false ; false
true || false ; true — 逻辑或
false || false ; false
!true ; false — 逻辑非
!false ; true
; 短路求值
x := 5
y := 0
if (y != 0 && x / y > 2) ; y=0 时不会执行 x/y,避免除零错误
MsgBox "不会到这里"
; 实用模式
if (FileExist(path) && FileGetSize(path) > 0)
MsgBox "文件存在且有内容"
字符串运算符
; 拼接(隐式拼接 — 表达式中相邻字符串和变量自动拼接)
msg := "Hello" " " "World" ; "Hello World"
msg := "Value: " value ; "Value: 42"(假设 value=42)
; 拼接运算符 .
msg := "Hello" . " " . "World" ; 与隐式拼接效果相同
; .= 拼接赋值
text := "Hello"
text .= " World" ; text = "Hello World"
; 注意括号的使用
msg := "Age: " (age + 1) ; "Age: 26"(先计算再拼接)
msg := "Result: " func() ; 先调用函数再拼接
位运算符
; 按位与
MsgBox 5 & 3 ; 1 (0101 & 0011 = 0001)
; 按位或
MsgBox 5 | 3 ; 7 (0101 | 0011 = 0111)
; 按位异或
MsgBox 5 ^ 3 ; 6 (0101 ^ 0011 = 0110)
; 按位取反
MsgBox ~5 ; -6(所有位翻转)
; 左移
MsgBox 1 << 3 ; 8 (1 * 2^3 = 8)
; 右移
MsgBox 8 >> 3 ; 1 (8 / 2^3 = 1)
三元运算符
; 条件 ? 真值 : 假值
status := age >= 18 ? "成年" : "未成年"
MsgBox age >= 18 ? "成年" : "未成年"
; 嵌套三元(谨慎使用,可读性差)
label := score >= 90 ? "优秀" : score >= 60 ? "及格" : "不及格"
运算符优先级
从高到低排列:
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1(最高) | ++ -- | 自增自减(后置更低) |
| 2 | ~ ! ** | 取反、逻辑非、幂运算 |
| 3 | * / % | 乘除取模 |
| 4 | + - | 加减 |
| 5 | << >> | 位移 |
| 6 | & | 按位与 |
| 7 | ^ | 按位异或 |
| 8 | ` | ` |
| 9 | < > <= >= = != == !== | 比较 |
| 10 | && | 逻辑与 |
| 11 | ` | |
| 12(最低) | ?: | 三元 |
用括号确保优先级
; 不清楚优先级时,加括号更安全
result := (a + b) * c ; 明确先加再乘
result := a + (b * c) ; 明确先乘再加
; 逻辑表达式加括号
if (a > 0 && b > 0) ; 清晰
赋值运算符汇总
| 运算符 | 等价写法 | 说明 |
|---|---|---|
:= | x := value | 赋值 |
+= | x := x + value | 加赋值 |
-= | x := x - value | 减赋值 |
*= | x := x * value | 乘赋值 |
/= | x := x / value | 除赋值 |
//= | x := x // value | 整除赋值 |
%= | x := x % value | 取模赋值 |
.= | x := x . value | 拼接赋值 |
&= | x := x & value | 位与赋值 |
| ` | =` | `x := x |
^= | x := x ^ value | 位异或赋值 |
<<= | x := x << value | 左移赋值 |
>>= | x := x >> value | 右移赋值 |
++ | x := x + 1 | 自增 |
-- | x := x - 1 | 自减 |
下一步: 05-控制流
