Skip to content
📖 Auto 编程语言(主书)本书目录

附录 B:运算符表 ​

本附录提供 Auto 语言全部运算符的完整参考,按优先级从高到低排列。当多个运算符出现在同一表达式中时,Auto 按照此顺序进行求值。

优先级总览 ​

优先级越高的运算符结合越紧密。同一组内的运算符大多数为左结合(另有说明的除外)。

优先级类别运算符
1(最高)一元前缀- ! * view mut ~
2乘法* / %
3加法+ -
4比较< > <= >=
5相等== != is
6逻辑与&&(别名:and)
7逻辑或||(别名:or)
8空值合并??
9范围.. ..=
10赋值= += -= *= /= %=
11管道|>
12(最低)错误传播后缀 ! 后缀 ?

详细表格 ​

1. 一元前缀运算符 ​

这些运算符出现在操作数之前,拥有最高优先级。

运算符说明示例RustPythonCTypeScript章节
-数值取反-x-x-x-x-x第 2 章
!逻辑非!flag!flagnot flag!flag!flag第 2 章
*解引用(原始指针)*ptr*ptr不适用*ptr不适用第 11 章
view借用为只读引用view s&s不适用const T*readonly第 11 章
mut借用为可变引用mut s&mut s不适用T*不适用第 11 章
~异步蓝图(类型修饰符)~Stringimpl FutureAwaitable不适用Promise第 16 章

2. 乘法运算符 ​

标准的乘法、除法和取余运算。左结合。

运算符说明示例结果RustPythonCTypeScript章节
*乘法6 * 7426 * 76 * 76 * 76 * 7第 2 章
/整数除法15 / 4315 / 415 // 415 / 4Math.trunc(15/4)第 2 章
%取余(模运算)17 % 5217 % 517 % 517 % 517 % 5第 2 章

两个 int 值相除时,结果向零截断。如果任一操作数为 float,则结果为 float。

3. 加法运算符 ​

加法和减法运算。左结合。+ 运算符也可用于字符串拼接。

运算符说明示例结果RustPythonCTypeScript章节
+加法 / 字符串拼接5 + 385 + 35 + 35 + 35 + 3第 2 章
-减法10 - 4610 - 410 - 410 - 410 - 4第 2 章

4. 比较运算符 ​

这些运算符比较两个值并返回 bool。适用于数字、字符串(字典序)和布尔值。

运算符说明示例结果RustPythonCTypeScript章节
<小于10 < 20true10 < 2010 < 2010 < 2010 < 20第 2 章
>大于10 > 20false10 > 2010 > 2010 > 2010 > 20第 2 章
<=小于等于10 <= 10true10 <= 1010 <= 1010 <= 1010 <= 10第 2 章
>=大于等于10 >= 20false10 >= 2010 >= 2010 >= 2010 >= 20第 2 章

5. 相等运算符 ​

相等性检查和类型测试。

运算符说明示例结果RustPythonCTypeScript章节
==等于10 == 20false10 == 2010 == 2010 == 2010 === 20第 2 章
!=不等于10 != 20true10 != 2010 != 2010 != 2010 !== 20第 2 章
is类型检查 / 模式匹配x is intboolmatches!isinstance()不适用typeof / instanceof第 7 章、第 17 章

is 运算符检查值是否匹配某个类型或模式。在控制流中,它会触发智能类型转换(smart cast),在分支内自动收窄类型(详见[第 17 章][ch17])。

6. 逻辑与 ​

短路求值:如果左侧为 false,则不计算右侧。

运算符说明示例结果RustPythonCTypeScript章节
&&逻辑与(符号形式)true && falsefalsetrue && false不适用a && ba && b第 2 章
and逻辑与(关键字形式)true and falsefalse不适用a and b不适用不适用第 2 章

两种形式可互换使用。a2p 转译器会将 && 转换为 Python 的 and。

7. 逻辑或 ​

短路求值:如果左侧为 true,则不计算右侧。

运算符说明示例结果RustPythonCTypeScript章节
||逻辑或(符号形式)true || falsetruetrue || false不适用a || ba || b第 2 章
or逻辑或(关键字形式)true or falsetrue不适用a or b不适用不适用第 2 章

两种形式可互换使用。a2p 转译器会将 \|\| 转换为 Python 的 or。

8. 空值合并 ​

运算符说明示例RustPythonCTypeScript章节
??为 ?T 提供默认值name ?? "unknown".unwrap_or("unknown")name or "unknown"不适用name ?? "unknown"第 9 章

?? 运算符在左侧为 Some(value) 时返回该值,否则返回右侧作为默认值。它仅适用于 ?T(可选类型)值。

9. 范围运算符 ​

用于 for 循环和创建范围表达式。

运算符说明示例生成值RustPythonCTypeScript章节
..右开区间0..50, 1, 2, 3, 40..5range(0, 5)for (i=0;i<5;i++)不适用第 3 章
..=右闭区间1..=51, 2, 3, 4, 51..=5range(1, 6)for (i=1;i<=5;i++)不适用第 3 章

.. 范围在右侧是开区间(不包含上界)。..= 范围在右侧是闭区间(包含上界)。

10. 赋值运算符 ​

在 Auto 中,赋值是语句而非表达式。它不返回值。

运算符说明示例等价写法RustPythonCTypeScript章节
=赋值x = 5--x = 5x = 5x = 5x = 5第 2 章
+=加后赋值x += 3x = x + 3x += 3x += 3x += 3x += 3第 2 章
-=减后赋值x -= 2x = x - 2x -= 2x -= 2x -= 2x -= 2第 2 章
*=乘后赋值x *= 4x = x * 4x *= 4x *= 4x *= 4x *= 4第 2 章
/=除后赋值x /= 2x = x / 2x /= 2x //= 2x /= 2x /= 2第 2 章
%=取余后赋值x %= 3x = x % 3x %= 3x %= 3x %= 3x %= 3第 2 章

11. 管道运算符 ​

运算符说明示例RustPythonCTypeScript章节
|>前向管道data |> transform |> save方法链方法链不适用方法链第 19 章

管道运算符将左侧的值作为第一个参数传递给右侧的函数。它实现了数据流风格,转换过程从左到右阅读。这等价于方法链(data.transform().save()),但适用于独立函数。

12. 错误传播运算符 ​

这些后缀运算符用于处理 ?T(可选类型)和 !T(结果类型)。它们具有最低优先级,因为它们作用于整个前面的表达式。

运算符说明示例RustPythonCTypeScript章节
后缀 !解包 !T;遇 Err 时 panicparse(s)!.unwrap()不适用不适用!(非空断言)第 9 章
后缀 ?传播错误 / 解包 !Tread_file(path)??(相同)不适用不适用不适用第 9 章

后缀 ! 解包 !T 值,成功时返回 Ok 中的值,失败时以 Err 消息触发 panic。类似于 Rust 的 .unwrap()。

后缀 ? 将错误沿调用栈向上传播。在返回类型标注了 ! 的函数内,expr? 在成功时解包结果,失败时将错误返回给调用者。等价于 Rust 的 ? 运算符。

类型修饰运算符 ​

这些运算符出现在类型位置而非表达式位置,用于修改类型标注的含义。

修饰符说明示例Rust 等价物章节
?T可选(可空)值fn find(id int) ?UserOption<T>第 9 章
!T结果(可能失败)值fn read(path str) !strResult<T, String>第 9 章
~T异步蓝图(期约值)fn fetch(url str) ~strimpl Future<Output=T>第 16 章

这些修饰符可以组合使用:~?String 表示未来的可选字符串,~!int 表示未来的可能失败的整数。

访问运算符 ​

这些运算符用于成员访问和可选链式调用。它们不在优先级表中列出,因为它们是具有固有优先级的后缀访问符(从左到右,紧密结合)。

运算符说明示例RustPythonCTypeScript章节
.字段 / 方法访问user.nameuser.nameuser.nameuser.nameuser.name第 8 章
?.可选链式访问addr?.city.as_ref()?.city不适用不适用addr?.city第 9 章
.await等待异步蓝图fetch().await.awaitawait不适用await第 16 章

注意事项 ​

  • 短路求值:&& 和 || 仅在必要时才计算右侧。如果 && 的左侧为 false,则跳过右侧。如果 \|\| 的左侧为 true,则跳过右侧。
  • 不支持运算符重载:Auto 不支持用户自定义的运算符重载。所有运算符的语义由语言固定定义。
  • 整数除法:两个 int 值用 / 相除时向零截断。如需小数结果,至少需要一个 float 操作数。
  • 赋值不是表达式:与 C 不同,Auto 中的赋值不返回值。不能写成 x = y = 5,也不能在 if 条件中使用赋值。
  • 关键字别名:and 和 or 是 && 和 \|\| 的别名。它们的存在主要是为了可读性,以及便于 Python 转译器直接映射。

基于 MIT 许可发布。