---
# System prepended metadata

title: 運算式
tags: [程式設計 I]

---


# 定義

## 運算式是什麼

![](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)