運算符——Kotlin基礎

一、單目運算符

運算符 對應的方法
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
a++ a.inc()
a– a.dec()

自增自減的過程

  • 當++、–放在變量前面時,執行過程如下:
  1. 先對變量調用inc()、dec()方法,並將方法返回值賦給變量。
  2. 自加或自減表達式返回變量的新值。
  • 當++、–放在變量後面時,執行過程如下 :
  1. 先用一個臨時變量緩存變量的值。
  2. 對變量調用inc()、dec()方法,並將方法返回值賦給變量。
  3. 自加或自減表達式返回臨時變量的值。

二、雙目運算符

1、算數運算符

運算符 對應的方法
a+b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)
a…b a.rangeTo(b)

2、in 運算符

運算符 對應的方法
a in b b.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]=b a.set(i, b)
a[i,j]=b a.set(i,j,b)
a[i_1,…,i_n]=b a.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+=b a.plusAssign(b)
a-=b a.minusAssign(b)
a*=b a.timesAssign(b)
a/=b a.divAssign(b)
a%=b a.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==b a?.equals(b) ?: (b === null)
a!=b !(a?.equals(b) ?: (b=== null)))

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

java中==!=等價於kotlin中的===!==

7、比較運算符

運算符 對應的方法
a>b a.compareTo(b) > 0
a<b a.compareTo(b) < 0
a>=b a.compareTo(b) >= 0
a<=b a.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位),得到的結果纔是真正移位的位數 。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章