企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 一元操作符 [TOC] | 表达式 | 翻译为 | | --- | --- | | `+a` | `a.unaryPlus()` | | `-a` | `a.unaryMinus()` | | `!a` | `a.not()` | 这个表是说,当编译器处理例如表达式`+a`时,它执行以下步骤: * 确定`a`的类型,令其为`T`; * 为接收者`T`查找一个带有`operator`修饰符的无参函数`unaryPlus()`,即成员函数或扩展函数; * 如果函数不存在或不明确,则导致编译错误; * 如果函数存在且其返回类型为`R`,那就表达式`+a`具有类型`R`; 【注意】这些操作以及所有其他操作都针对[基本类型](http://www.kotlincn.net/docs/reference/basic-types.html)做了优化,不会为它们引入函数调用的开销。 以下是如何重载一元减运算符的示例: ``` data class Point(val x: Int, val y: Int) operator fun Point.unaryMinus() = Point(-x, -y) val point = Point(10, 20) fun main() { println(-point) // 输出“Point(x=-10, y=-20)” } ``` ### 递增与递减 | 表达式 | 翻译为 | | --- | --- | | `a++` | `a.inc()`返回值是`a` | | `a--` | `a.dec()`返回值是`a` | | `++a` | `a.inc()`返回值是`a+1` | | `--a` | `a.dec()`返回值是`a-1` | `inc()`和`dec()`函数必须返回一个值,它用于赋值给使用`++`或`--`操作的变量。它们不应该改变在其上调用`inc()`或`dec()`的对象。 编译器执行以下步骤来解析后缀形式的操作符,例如`a++`: * 确定`a`的类型,令其为`T`; * 查找一个适用于类型为`T`的接收者的、带有`operator`修饰符的无参数函数`inc()`; * 检查函数的返回类型是`T`的子类型。 计算表达式的步骤是: * 把`a`的初始值存储到临时存储`a0`中; * 把`a.inc()`结果赋值给`a`; * 把`a0`作为表达式的结果返回。 对于`a--`,步骤是完全类似的。 对于前缀形式`++a`和`--a`以相同方式解析,其步骤是: * 把`a.inc()`结果赋值给`a`; * 把`a`的新值作为表达式结果返回。