本章主讲Kotlin的运算符

一、运算符

1. 算术运算符

1.1 一元运算符

一元运算符一共三个,-、++ 、--。

android kotlin输出 kotlin print_ide

fun main(args: Array<String>) {
    var int = 1
    val a = int++
    val b = ++int
    println(-1)
    println(a)
    println(b)
}

结果:

-1  (取反符)
1   (先赋值再运算,所以1没有问题)
3   (先运算再赋值,3没有问题)

1.2 二元运算符

二元运算符,比较简单,就是一些数学基本运算,它需要对基本数据类型使用。

+(加)、-(减)、*(乘)、/(除)和%(取余数)

栗子:

fun main(args: Array<String>) {
    var int = 10

    val add = int + 1
    val minus = int - 1
    val multiply = int * 1
    val divide = int / 1
    val `%` = int % 5

    println(add)
    println(minus)
    println(multiply)
    println(divide)
    println(`%`)
}

结果:

11
9
10
10
0

1.3 算术赋值运算符

就是+=、-=、*=、/=和%=,这个你要试试就行了

栗子:

fun main(args: Array<String>) {
    val int = 10
    var a = 100
    a += int
    println(a)
    a -= int
    println(a)
    a *= int
    println(a)
    a /= int
    println(a)
    a %= int
    println(a)

}

结果:

110
100
1000
100
0

简单例子说明就是a+=int ==a=a+int

 使用方式很简单,但是不能给没有初始化的值使用。

fun main(args: Array<String>) {
    val int = 10
    var a += int  //a没有初始化报错
    
}

2. 关系运算符

关系运算符是比较两个表达式大小的的运算符,结果为布尔类型。

<、>、== 、 ===、 !=、 !==、 <= 、>= 这8种,我先把简单演示一下,再讲复杂的。

栗子:简单实例

fun main(args: Array<String>) {
    val a = 1
    
    println(a > 0)  //a大于0
    println(a < 0)  //a小于0
    println(a <= 1)  //a小于等于0
    println(a >= 0)  //a小于等于0

}

true   
false
true
true

很简单吧!

下面来看==、!=、===、!==

==就是比较它们值,===比较的是引用。==就是Java中的equals方法,===就是Java中的==,它比较的是地址值。

同样先简单的例子:来说明==和!=的区别

fun main(args: Array<String>) {
    val a = 1
    val b = 1

    println(a == b)   //就是值判断是否相等
    println(a != b)   //取反

}

true    
false   两个值相等,然后就取反。(就是和正确结果相反)

再来看===和!==的区别

fun main(args: Array<String>) {
    val a = 1
    val b = 1

    println(a === b)
    println(a !== b)

}

结果相同。因为在比较基本类型的时候,比较的是值。
true
false

现在看引用类型

先写个人的类

class Person(val name: String, val age: Int) {
    
}

测试:

fun main(args: Array<String>) {
    val person1 = Person("王", 11)
    val person2 = Person("王", 11)

    println(person1 == person2)
    println(person1 != person2)

}

结果:

false   因为比较的是引用类型。Any.equals() 函数比较的是两个对象的引用是否相等。也就是说,如果没有覆盖 equals() 函数,== 与 === 的结果是相同的。如果某个类有比较属性是否相等的需求,需要自行覆盖 equals() 方法。  来自欢颜 的博客

true   

那我们重写Person类的equals方法,试试

class Person(val name: String, val age: Int) {
    override fun equals(other: Any?): Boolean {
        if (name == "王" || age == 11) {
            return true
        }
        return false
    }
}

true
false

好的,验证成功,接下看===表现

===是比较的地址值,还是上面的例子,Person类不变。

fun main(args: Array<String>) {
    val person1 = Person("王", 11)
    val person2 = Person("王", 11)

    println(person1 === person2)
    println(person1 !== person2)

}

结果

false   不是一个对象,地址值肯定不同
true

再看

fun main(args: Array<String>) {
    val person1 = Person("王", 11)
    val person2 = Person("王", 11)
    val person3 = person1
    println(person1 === person3)
    println(person1 !== person3)

}

结果:

true   
false

我们把重写的equals方法删除了

3.其它运算符

Kotlin 支持以下操作符和特殊符号:

+、 -、 *、 /、 % —— 数学操作符

* 也用于将数组传递给 vararg 参数

=

赋值操作符

也用于指定参数的默认值

+=、 -=、 *=、 /=、 %= —— 广义赋值操作符

++、 -- —— 递增与递减操作符

&&、 ||、 ! —— 逻辑“与”、“或”、“非”操作符(对于位运算,请使用相应的中缀函数

==、 != —— 相等操作符(对于非原生类型会翻译为调用 equals()

===、 !== —— 引用相等操作符

<、 >、 <=、 >= —— 比较操作符(对于非原生类型会翻译为调用 compareTo()

[、 ] —— 索引访问操作符(会翻译为调用 get 与 set

!! 断言一个表达式非空

?. 执行安全调用(如果接收者非空,就调用一个方法或访问一个属性)

?: 如果左侧的值为空,就取右侧的值(elvis 操作符

:: 创建一个成员引用或者一个类引用

.. 创建一个区间

: 分隔声明中的名称与类型

? 将类型标记为可空

->

分隔 lambda 表达式的参数与主体

分隔在函数类型中的参数类型与返回类型声明

分隔 when 表达式分支的条件与代码体

@

引入一个注解

引入或引用一个循环标签

引入或引用一个 lambda 表达式标签

引用一个来自外部作用域的 “this”表达式

引用一个外部超类

; 分隔位于同一行的多个语句

$ 在字符串模版中引用变量或者表达式

_

在 lambda 表达式中代替未使用的参数

解构声明中代替未使用的参数

                                                                                                  -----------------------来自官网

4.运算符优先级

android kotlin输出 kotlin print_ide_02

                                                                                                                                             -----------来自Kotlin从小白到大牛