运算符——Kotlin基础

一、单目运算符

运算符对应的方法
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()
a–a.dec()

自增自减的过程

  • 当++、–放在变量前面时,执行过程如下:
  1. 先对变量调用inc()、dec()方法,并将方法返回值赋给变量。
  2. 自加或自减表达式返回变量的新值。
  • 当++、–放在变量后面时,执行过程如下 :
  1. 先用一个临时变量缓存变量的值。
  2. 对变量调用inc()、dec()方法,并将方法返回值赋给变量。
  3. 自加或自减表达式返回临时变量的值。

二、双目运算符

1、算数运算符

运算符对应的方法
a+ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a…ba.rangeTo(b)

2、in 运算符

运算符对应的方法
a in bb.contains(a)
a !in b!b.minus(a)

in是一个可以简化的语法糖。

Kotlin中我们使用只要带有contains的类,都可以用in来代替。

var str1 = "zincPower"
println(str1.contains("Power"))
println("Power" in str1)

// 数组也是可以用来替换
val array = arrayOf(24, 45, 100, -3, 30)
println(array.contains(100))
println(100 in array)

在这里插入图片描述

3、索引访问符

运算符对应的方法
a[i]a.get(i)
a[i,j]a.get(i,j)
a[i_1,…i_n]a.get(i_1,…,i_n)
a[i]=ba.set(i, b)
a[i,j]=ba.set(i,j,b)
a[i_1,…,i_n]=ba.set(i_1,…,b)

也是一个语法糖,在访问字符串或列表时,可以用 str[index]list[index],得益于此处的方法。

4、调用符

运算符对应的方法
a()a.invoke()
a(b)a.invoke(b)
a(b1,b2)a.invoke(b1,b2)
a(b1,b2,b3,…)a.invoke(b1,b2,b3,…)

5、广义赋值符

运算符对应的方法
a+=ba.plusAssign(b)
a-=ba.minusAssign(b)
a*=ba.timesAssign(b)
a/=ba.divAssign(b)
a%=ba.remAssign(b)
plusAssign 的执行顺序
  1. 如果plus()方法也存在, Kotlin将会报告错误(调用的目标方法不确定)。
  2. 确保plusAssign()没有返回值,否则报告错误。
  3. 如果能通过前两步的检查,则转换为执行a.plusAssign(b)。如果plusAssign()方法不存在,那么 a+=b 将转换为 a=a+b 代码。

Kotlin 的赋值运算不是表达式,因此不需要返回值 。

这里因为没有plusAssign则进行调用了plus

var m1 = MyTest("jp")
var m2 = MyTest("xp")
m1 += m2
println(m1.name)

class MyTest(val name: String) {
    operator fun plus(myTest: MyTest): MyTest {
        println("plus")
        return MyTest("zi")
    }
}

这里调用了plusAssign值得注意没有返回值

var m1 = MyTest("jp")
var m2 = MyTest("xp")
m1 += m2

class MyTest(val name: String) {
    operator fun plusAssign(myTest: MyTest) {
        println("plusAssign")
    }
}

6、==、!=符

运算符对应的方法
a==ba?.equals(b) ?: (b === null)
a!=b!(a?.equals(b) ?: (b=== null)))

kotlin中==和java中的equals相等。

java中==!=等价于kotlin中的===!==

7、比较运算符

运算符对应的方法
a>ba.compareTo(b) > 0
a<ba.compareTo(b) < 0
a>=ba.compareTo(b) >= 0
a<=ba.compareTo(b) <= 0

值得注意的是,java中Comparable接口中有compareTo方法,所以实现了Comparable接口的类都可以用这个。

三、位运算符

支持的七个为运算符

  • and:与
  • or:或
  • inv:非
  • xor:异或
  • shl:左移运算符
  • shr:右移运算符
  • ushr:无符号右移运算符
shl

左移指定位数后,补0。

shr、ushr

对于shr运算符而言,把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位填充,即如果第一个操作数原来是正数,则左边补0;如果第一个操作数是负数,则左边补1。

ushr是无符号右移运算符,它把第一个操作数的二进制码右移指定位数后,左边空出来的位总是 以0 充。

左右移规则
  • 对于 Int类型的整数移位a shr b,当 b>32 时,系统先用b对32求余(因为Int类型只有32位),得到的结果才是真正移位的位数。
    例如, a shr 33和a shr 1的结果完全一样,而a shr 32的结果和a相同。
  • 对于Long类型的整数移位a shr b,当 b>64时,总是先用b对64求余(因为Long类型是64位),得到的结果才是真正移位的位数 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值