运算符
项目链接:GitHub · 编译器源码
概述
MaìLang 提供丰富的运算符,包括算术、比较、逻辑、位运算和赋值运算符。
算术运算符
| 运算符 | 名称 | 说明 | 示例 |
|---|
+ | 加法 | 两数相加或字符串拼接 | 1 + 2 = 3, "a" + "b" = "ab" |
- | 减法 | 两数相减 | 5 - 3 = 2 |
* | 乘法 | 两数相乘或字符串重复 | 4 * 3 = 12, "ha" * 3 = "hahaha" |
/ | 除法 | 两数相除 | 10 / 3 = 3(整数), 10.0 / 3.0 = 3.333... |
% | 取模 | 求余数 | 10 % 3 = 1 |
** | 幂运算 | 求幂 | 2 ** 3 = 8 |
- | 取负 | 一元运算符 | -5 |
类型行为
int + int = int // 1 + 2 = 3
int + float = float // 1 + 2.0 = 3.0
float + float = float // 1.0 + 2.0 = 3.0
str + str = str // "a" + "b" = "ab"
str + any = str // "a" + 42 = "a42"
int * int = int // 3 * 4 = 12
str * int = str // "ha" * 3 = "hahaha"
比较运算符
| 运算符 | 名称 | 说明 | 示例 |
|---|
== | 等于 | 值相等 | 1 == 1 → true |
!= | 不等于 | 值不相等 | 1 != 2 → true |
< | 小于 | 左小于右 | 1 < 2 → true |
<= | 小于等于 | 左小于等于右 | 1 <= 1 → true |
> | 大于 | 左大于右 | 2 > 1 → true |
>= | 大于等于 | 左大于等于右 | 2 >= 2 → true |
比较规则
int 与 int 比较 // 按值比较
float 与 float 比较 // 按值比较
int 与 float 比较 // int 转为 float 后比较
str 与 str 比较 // 按字典序比较
bool 与 bool 比较 // true > false
null 与 null 比较 // 总是相等
逻辑运算符
| 运算符 | 名称 | 说明 | 示例 |
|---|
&& | 逻辑与 | 两者都为真 | true && false → false |
|| | 逻辑或 | 任一为真 | true || false → true |
! | 逻辑非 | 取反 | !true → false |
短路求值
// && 短路:如果左边为 false,右边不执行
false && expensive_function() // expensive_function 不执行
// || 短路:如果左边为 true,右边不执行
true || expensive_function() // expensive_function 不执行
真值表
&& | true | false
---|------|------
true | true | false
false | false | false
|| | true | false
---|------|------
true | true | true
false | true | false
位运算符
| 运算符 | 名称 | 说明 | 示例 |
|---|
& | 按位与 | 两位都为1则为1 | 0b1010 & 0b1100 → 0b1000 |
| | 按位或 | 任一位为1则为1 | 0b1010 | 0b1100 → 0b1110 |
^ | 按位异或 | 两位不同则为1 | 0b1010 ^ 0b1100 → 0b0110 |
~ | 按位取反 | 所有位取反 | ~0b1010 → ...11110101 |
<< | 左移 | 左移指定位数 | 1 << 3 → 8 |
>> | 右移 | 右移指定位数 | 8 >> 2 → 2 |
示例
// 设置位
let flags = 0b0000
flags = flags | 0b0001 // 设置第0位
flags = flags | 0b0010 // 设置第1位
// 清除位
flags = flags & ~0b0001 // 清除第0位
// 切换位
flags = flags ^ 0b0001 // 切换第0位
// 检查位
if flags & 0b0001 != 0 {
// 第0位已设置
}
赋值运算符
| 运算符 | 等价形式 | 示例 |
|---|
= | - | x = 10 |
+= | x = x + y | x += 5 |
-= | x = x - y | x -= 3 |
*= | x = x * y | x *= 2 |
/= | x = x / y | x /= 4 |
%= | x = x % y | x %= 3 |
&= | x = x & y | x &= 0xFF |
|= | x = x | y | x |= 0x01 |
^= | x = x ^ y | x ^= 0xFF |
<<= | x = x << y | x <<= 1 |
>>= | x = x >> y | x >>= 1 |
运算符优先级
从高到低:
| 优先级 | 运算符 | 结合性 | 说明 |
|---|
| 15 | () | - | 括号 |
| 14 | . [] () | 左 | 成员访问、索引、函数调用 |
| 13 | ** | 右 | 幂运算 |
| 12 | - ! ~ | 右 | 一元运算符 |
| 11 | * / % | 左 | 乘法类 |
| 10 | + - | 左 | 加法类 |
| 9 | << >> | 左 | 移位 |
| 8 | & | 左 | 按位与 |
| 7 | ^ | 左 | 按位异或 |
| 6 | | | 左 | 按位或 |
| 5 | == != < <= > >= | 左 | 比较 |
| 4 | && | 左 | 逻辑与 |
| 3 | || | 左 | 逻辑或 |
| 2 | = += -= 等 | 右 | 赋值 |
| 1 | , | 左 | 逗号 |
下一步