# 定義
## 運算式是什麼

在大學以前的數學課,我們很常會接觸一個公式 : `y = a*x + b`
那我們把它套用在程式的運算式中去一一介紹
y --> 變數
a、x、b --> 運算元
*、+ --> 運算子
**示範Code** 👉
```c=
#include<stdio.h>
int main()
{
// y = ax + b
int a = 3, x = 6 , b = 3;
int y = a * x + b;
printf("y = %d",y); //21
return 0;
}
```
## 運算子的型別
### **代數運算子**
用在我們日常的十進位的運算上
| 代數運算子 | 解釋 |
| ---------- | ------------ |
| + | 相加 |
| - | 相減 |
| * | 相乘 |
| / | 相除(取商) |
| % | 相除(取餘數) |
**示範Code** 👉
```c=
#include<stdio.h>
int main()
{
int a = 10, b = 3;
printf("%d",a + b); //13
printf("%d",a - b); //7
printf("%d",a * b); //30
printf("%d",a / b); //3
printf("%d",a % b); //1
return 0;
}
```
----
### **比較運算子**

比較時會用到的運算子
| 比較運算子 | 解釋 |
| ---------- | ------------ |
| == | 相等 |
| != | 不相等(相異) |
| > | 大於 |
| < | 小於 |
| >= | 大於或等於 |
| <= | 小於或等於 |
**示範Code** 👉
``` c=
#include <stdio.h>
int main ()
{
int a = 0 , b = 0;
if (a > b)
{
printf("Bigger!!\n");
}
else if (a == b)
{
pruintf("Same!!\n");
}
else
{
printf("Sammler\n");
}
return 0;
}
```
----
### **邏輯運算子**
當條件有多個一起判斷 或 否定的
| 邏輯運算子 | 解釋 |
| ---------- | --------- |
| && | logic AND |
| \|\| | logic OR |
| ! | logic NOT |
**示範Code** 👉
```c=
#include <stdio.h>
int main()
{
int a = 0 , b = 3;
//單一比較 number_b 大於 number_a
if(a < b)
{
printf("number_b is bigger\n\n");
}
//比較 number_b 大於 number_a 並且 number_b 要大於 5
if(a < b && b > 5)
{
printf("WOW number_b is bigger and more than five\n\n");
}
//比較 number_b 大於 number_a 或 number_b 要大於 5
if(a < b || b > 5)
{
printf("number_b is bigger or more than five\n\n");
}
//比較 number_a 沒有 大於 number_b
if(!(a > b))
{
printf("number_a is not bigger than number_b\n\n");
}
return 0;
}
```
<div style="border: 2px solid red; padding: 10px; background-color: #BBFFFF ; color:#003060;">
錯誤的示範:exclamation:
當我們想寫出數學的 3 < a < 5 在程式碼上時
無法直接寫成 `if( 3 < a < 5)` 這樣會出錯
這是因為 3 < a < 5 會先回傳前面的 3 < a 是TRUE 或 FALSE,在去比對 < 5
所以我們應寫成
if( 3 < a && a < 5)
這樣才對
</div>
----
### **三元運算子**
三元運算子的使用方法
有點類似 if-else ,但三元運算會回傳值
`condition ? exprIfTrue : exprIfFalse`
- conidtion - 條件
- exprIfTrue - 條件成立回傳
- exprIfFalse - 條件不成立回傳
</br>
會回傳值的理解
三元運算子不能這樣寫
```c=
#include <stdio.h>
int main()
{
int number = 3;
number ==3 ? 1 : 0;
if(number == 1)
{
printf("number == 3\n");
}
return 0;
}
```
必須這樣
```c=
#include <stdio.h>
int main()
{
int number = 3, judge =0;
judge = (number == 3 ? 1 : 0);
if(judge == 1)
{
printf("number == 3\n");
}
return 0;
}
```
**示範Code** 👉
```c=
#include <stdio.h>
int main()
{
int number;
number = 5;
number = 5 < 2 ? 5 : 10;
printf("%d",assign); //10
return 0;
}
```
----
### **二元運算子**
用在我們二進位的計算上
| 二元運算子 | 解釋 |
|:----------:| ----------- |
| & | bitwise AND |
| | | bitwise OR |
| ^ | bitwise XOR |
| ~ | 取補數 |
| >> | 右移 |
| << | 左移 |
**示範Code** 👉
```c=
#include<stdio.h>
int main()
{
int a = 3, b = 0;
/*
二進位的轉換
a 011
b 000
*/
printf("%d\n",a & b); //0
printf("%d\n",a | b); //3
printf("%d\n",a ^ b); //3
printf("%d\n",a << 1);//6
printf("%d\n",a >> 1);//1
return 0;
}
```
**範例圖片**


----
### **運算子優先順序**
對比的圖

1. 最基本的括號先做
**示範Code** 👉
```c=
#include <stdio.h>
int main()
{
int a = 10,b = 3 ,c =3;
printf("%d\n", a * b - c); //27
printf("%d\n", a * (b - c)); //0
return 0;
}
```
<div style="width: 400px; height: 130px; background: #ECF5FF;padding: 1em;">
解釋💡
會造成兩次輸出不同的原因,是因為
第一次的運算方式為 a*b -> -c
而第二次為 b-c -> *a
</div>
2. **\+\+a && a\+\+ 的區別**
<div style="width: 320px; height: 110px; background: #ECF5FF;padding: 1em;">
解釋💡
\+\+a 就是我們先把 a + 1 -> 做事
a\+\+ 就是我們先用 a 做事 -> 執行 a + 1
</div>
**示範Code** 👉
```c=
#include <stdio.h>
int main()
{
int a = 1;
printf("%d\n",a++);//1
printf("%d\n",a); //2
int b = 1;
printf("%d\n",++b);//2
printf("%d\n",b); //2
return 0;
}
```
3. **== 範例**
**示範Code** 👉
```c=
#include <stdio.h>
int main()
{
int a = 5, b = 3;
a = b == 3;
printf("%d\n",a); //1
return 0;
}
```
<div style="width: 370px; height: 110px; background: #ECF5FF;padding: 1em;">
解釋💡
因為\=\=的優先度比較高
所以會先做 `b == 3` 再去做 a = (TRUE)
</div>
----
參考:
[運算式](https://opensourcedoc.com/c-programming/operator/)
[運算子優先順序](https://learn.microsoft.com/zh-tw/cpp/c-language/precedence-and-order-of-evaluation?view=msvc-170)
[運算子優先順序圖來源](http://dns2.asia.edu.tw/~wzyang/slides/Java/Hung/java2012-ch04.pdf)