# 定義 ## 運算式是什麼 ![](https://hackmd.io/_uploads/HJrxpjqya.png) 在大學以前的數學課,我們很常會接觸一個公式 : `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; } ``` ---- ### **比較運算子** ![](https://hackmd.io/_uploads/S10i4lVxp.png =40%x) 比較時會用到的運算子 | 比較運算子 | 解釋 | | ---------- | ------------ | | == | 相等 | | != | 不相等(相異) | | > | 大於 | | < | 小於 | | >= | 大於或等於 | | <= | 小於或等於 | **示範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; } ``` **範例圖片** ![](https://hackmd.io/_uploads/BkaTrMhkT.png =80%x) ![](https://hackmd.io/_uploads/S1aoUzhka.png =80%x) ---- ### **運算子優先順序** 對比的圖 ![](https://hackmd.io/_uploads/SyowhE01a.png) 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)