Skip to content

运算符 ​

项目链接: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则为10b1010 & 0b1100 → 0b1000
|按位或任一位为1则为10b1010 | 0b1100 → 0b1110
^按位异或两位不同则为10b1010 ^ 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 + yx += 5
-=x = x - yx -= 3
*=x = x * yx *= 2
/=x = x / yx /= 4
%=x = x % yx %= 3
&=x = x & yx &= 0xFF
|=x = x | yx |= 0x01
^=x = x ^ yx ^= 0xFF
<<=x = x << yx <<= 1
>>=x = x >> yx >>= 1

运算符优先级 ​

从高到低:

优先级运算符结合性说明
15()-括号
14. [] ()左成员访问、索引、函数调用
13**右幂运算
12- ! ~右一元运算符
11* / %左乘法类
10+ -左加法类
9<< >>左移位
8&左按位与
7^左按位异或
6|左按位或
5== != < <= > >=左比较
4&&左逻辑与
3||左逻辑或
2= += -= 等右赋值
1,左逗号

下一步 ​