###### tags: `FoShiShi`
# 運算子
## What
運算子是**一種記號或符號,用於指定運算式內執行的計算類型**
例:`+(加), -(減), *(乘), /(除)`
其實就**跟數學的運算子一樣**
只是在`C++`的世界中
**有更多的運算方式跟更多可以用來計算的變數**
當然你也可重新定義運算子的計算方式,但這這就是`函式`的範圍了
這裡先不多講
## When
當要對多個**數字或資料型態做運算**的時候
## How
### 運算子pt.0(設定運算子)
就是`=`
用來把**後者的值**指定到**前者**
例:`int a = 1`
:::warning
`=` **不是判斷是否等於的意思**
`==`才是
:::
:::danger
不要把`=`跟`==`搞混
這debug起來很麻煩
:::
---
### 運算子pt.1(算數運算子)
一般運算子就是一般的運算子
跟數學一樣的那種
| 運算子 | 名稱 | 計算方式 | 例子 |
| ----- | ------------- | ------------------------ | --------------- |
| `+` | 加(add) | 取兩值**相加**之值 | `int x = a + b` |
| `-` | 減(subtract) | 取兩值**相減**之值 | `int x = a - b` |
| `*` | 乘以(multiply) | 取兩值**相乘**之值 | `int x = a * b` |
| `/` | 除以(divide) | 取**前值除以後值之值** | `int x = a / b` |
| `%` | 取模(modulo) | 取前值除以後值之**餘數之值** | `int x = a % b` |
:::info
可能有人對這邊的**取模**比較陌生
其實就是**取餘數**
但當**被除數為負數時**,得出的餘數將會是負數(不整除的情況下)
:::
例:
```cpp=
cout << 5 % 2 << endl; // 輸出 1
cout << -5 % 2 << endl; // 輸出 -1
cout << 5 % -2 << endl; // 輸出 1
cout << -5 % -2 << endl; // 輸出 -1
```
| 運算子 | 名稱 | 計算方式 | 例子 |
| ----- | ------| --------------- | -------- |
| `+=` | 加等於 | 將一值**加上另一值** | `a += b` |
| `-=` | 減等於 | 將一值**減上另一值** | `a -= b` |
| `*=` | 乘等於 | 將一值**乘上另一值** | `a *= b` |
| `/=` | 除等於 | 將一值**除上另一值** | `a /= b` |
| `%= ` | 模等於 | 將一值**取另一值之模** | `a %= b` |
:::info
`a += b`就是`a = a + b`
其他的以此類推
:::
| 運算子 | 名稱 | 計算方式 | 例子 |
| ----- | ---- | ------- | ------- |
| `++` | 加加 | 將一值加1 | `a ++ ` |
| `--` | 減減 | 將一值減1 | `a -- ` |
:::info
`a ++ `就是`a += 1`就是`a = a + 1`
其他的以此類推
:::
:::warning
沒有`**`跟`//`或`%%`這種鬼東西
這裡不是`python`
:::
:::info
這裡的`+, -`也可以當作**正跟負**
像是
`int a = 1;`
`int b = -a`
`b` 就會是 `-1`
:::
---
### 運算子pt.2(關係運算子)
關係運算子就是對**兩個東西**取關係
判斷成**邏輯條件**
邏輯條件就是對**某些狀況進行的判斷**(`true` 跟 `false`)
:::info
**關係運算子**跟**邏輯運算子**都會配 [**`判斷`**](https://chrislaiisme.github.io/FoShiShi/if_else)(<font size=1px>這裡其實有超連結只是字是藍的所以不明顯</font>)來實作
:::
| 運算子 | 名稱 | 計算方式 | 例子 |
| ----- | ------ | ----------------- | -------- |
| `==` | 等於 | 兩值是否相等 | `a == b` |
| `!=` | 不等於 | 兩值是否不相等 | `a != b` |
| `<` | 小於 | 前值是否小於後值 | `a < b` |
| `>` | 大於 | 前值是否大於後值 | `a > b` |
| `<= ` | 小於等於 | 前值是否小於等於後值 | `a <= b` |
| `>= ` | 大於等於 | 前值是否大於等於後值 | `a >= b` |
:::danger
不要把`==` 跟 `=`搞混
用錯的話`debug`起來就真的很麻煩
(**因為很重要所以再講一次**)
:::
---
### 運算子pt.3(邏輯運算子)
邏輯運算子是用來做出**邏輯條件的運算**
#### &&(and)
當我們做出`a && b`時
必須要a跟b都為`true`才會回傳`true`
其他都回傳`false`
| a($\downarrow$)\b($\to$) | false | true |
| ------------------------ | ----- | ----- |
| false | false | false |
| true | false | true |
#### ||(or)
當我們做出`a || b`時
a或b為`true`就會回傳`true`
其他都回傳`false`
| a($\downarrow$)\b($\to$) | false | true |
| ------------------------ | ----- | ----- |
| false | false | true |
| true | true | true |
#### !(not)
當我們做出`!a`時
a為`true`就回傳`false`
a為`false`就回傳`true`
(顯然這簡單到不用表格)
:::danger
將邏輯運算子配合關係運算子可以形成各種神奇東西
但是如果要判斷`a < b < c`這樣的東西**不能直接這樣寫**
要用`&&`去連接
像是
`a < b && b < c`
:::
---
### 運算子pt.4(位元運算子)
這裡就不講了
因為初學根本用不到
有興趣自己去查
---
### ()
當你接了一大堆運算子的時候
你會發現**版面很亂**
或有些**運算的順序有問題**
所以可以在某些地方加上 **()**
就跟一般數學式的()一樣
會先執行裡面的運算
例:
```cpp=
int a = 1, b = 2, c = 3;
int d = (a + b) * ((c - a) / 2);
```
:::info
`C++`中依然符合**先乘除後加減的規則**
至於其他的運算子的先後順序
有興趣的的可以去查 **"C++運算子優先順序"**
:::
---
## 實際應用
### 題目1
輸入兩數`a, b`
請輸出`a + b`
:::spoiler solution
用`+`
```cpp=
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
```
:::
### 題目2
輸入三個數`a, b, c`
先把`a`加上`5`
再把`b`乘上`a`
最後輸出`b`取`c`的模
:::spoiler solution
反正就是上面的運算子
我懶得打
```cpp=
#include<iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
a += 5;
b *= a;
cout << b % c << endl;
}
```
:::