> For the complete documentation index, see [llms.txt](https://kuroclass.gitbook.io/kotlin/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kuroclass.gitbook.io/kotlin/ch3/yun-suan-zi.md).

# 運算子

在開始介紹運算子之前我們先來認識一個IntelliJ裡面一個實用的功能：

## Kotlin REPL

REPL是read（讀取）、evaluate（求值）、print（輸出）、loop（迴圈）四個字的開頭。我們可以寫下一小段想測試的程式碼執行然後Kotlin REPL會依序執行上面的流程，讓我們可以在不影響專案的情況下測試一段程式碼。

> 那要怎麼開啟Kotlin REPL呢？
>
> 頂部選單 Tools -> Kotlin-> Kotlin REPL 就能開啟囉～接下來我們有關運算子的介紹就會使用 Kotlin REPL 來介紹

## 指定運算子（=）

<figure><img src="https://cdn-images-1.medium.com/max/800/1*GTwuvUh7BSnP36KzDpXGfw.jpeg" alt=""><figcaption><p>在程式語言裡面指定運算子(=)並不是數學上的等號，所以這一行程式碼並不是一個無解的方程式</p></figcaption></figure>

指定運算子其實就是把"***右邊運算出來的結果***"，設定到"***左邊的變數裡面***"，所以 x = x + 1，翻譯成白話文就是"把 x 變數裡的值加1之後，再設定回x變數裡"的意思。我們可以測試看看下面的程式碼看看會出現什麼樣的結果～

```kotlin
var x = 5
x = x + 1
print(x)
```

## 算術運算子（+, -, \*, /, %）

* +：加法運算
* \- ：減法運算
* \*：乘法運算
* /：除法運算
* %：取餘數運算

我們來試試看下面會出現什麼結果吧～

```kotlin
val a = 10
val b = 3
print(a + b)
print("\n")
print(a - b)
print("\n")
print(a * b)
print("\n")
print(a / b)
print("\n")
print(a % b)
```

## 複合運算子（+=, -=, \*=, /=, %=）

* a += 1：等價於 a = a + 1
* a -= 1：等價於 a = a - 1
* a \*= 1：等價於 a = a \* 1
* a /= 1：等價於 a = a / 1
* a %= 1：等價於 a = a % 1

## 單元運算子（+, -, ++, — , !）

單元運算子顧名思義，他用來處理單個運算元，簡單來說單元運算子只有其中一邊有東西

* +：正號運算子（一般來說都會省略）
* -：負號運算子（負數變正數、正數變負數）
* ++：遞增運算子
*  — ：遞減運算子
* !：反向運算子（true變false、false變true）

這邊比較值得注意的地方是遞增（減）運算子有前綴跟後綴的差別，我們可以來比較一下他們的差異

```kotlin
var a = 1
print(a++)
print("\n")
print(a)

print("\n")

var b = 1
print(++b)
print("\n")
print(b)
```

執行後有沒有看出什麼差異呢？

## 關係運算子（===, !==, ==, !=, >, >=, <, <=）

* \===：兩個實例是否為**相同**參照
* !==：兩個實例是否為**不同**參照
* \==：左右側的值是否**相等**
* !=：左右側的值是否**相異**
* \>：左側是否**大於**右側
* \>=：左側是否**大於等於**右側
* <：左側是否小**於**右側
* <=：左側是否小**於等於**右側

```kotlin
val a = 1
val b = 2
print(a == b)
print("\n")
print(a != b)
print("\n")
print(a > b)
print("\n")
print(a >= b)
print("\n")
print(a < b)
print("\n")
print(a <= b)
```

## 條件運算子（&&, ||）

* &&：and運算
* ||：or運算

| &&    | true  | false |
| ----- | ----- | ----- |
| true  | true  | false |
| false | false | false |

| \|\|  | true | false |
| ----- | ---- | ----- |
| true  | true | true  |
| false | true | false |

### **短路**

&& 跟 || 有個很重要的特性，我們把它稱之為短路：在可以確認運算結果的時候會自動忽略後面全部的運算。

這是什麼意思呢？我們可以先在程式碼裡面加入下面兩個函數試試看

```kotlin
fun a(): Boolean {
    println("invoke a function-")
    return true
}

fun b(): Boolean {
    println("invoke b function-")
    return false
}
```

即便我們現在還沒有學過函數，但是我們依然可以用Kotlin PERL呼叫看看執行的時候會發生什麼事情。那接下來我們來試試看在Kotlin PERL分別執行下面的程式碼又會發生什麼事呢？

```kotlin
print(a() && b())
print("\n")
print(b() && a())
print("\n")
print(a() || b())
print("\n")
print(b() || a())
```

> 我們在這邊先簡單的認識過在Kotlin裡面比較常用的運算子了
>
> BUT！對就是這個BUT！
>
> 運算子在Kotlin裡面的定義並不僅僅是現在這樣看到的這麼簡單而已，這個我們在之後學習到函數的時候會再介紹什麼是“operator function”，以及運算子怎麼跟operator function交互運作的
