---
GA: G-RZYLL0RZGV
---
###### tags: `大一程設-下` `東華大學` `東華大學資管系` `基本程式概念` `資管經驗分享`
運算子的優先權
===
[TOC]
## 前言
在任何的程式語言裡面,都有運算子,如 `+ - * /`,我們在學數學的時候都知道,先乘除後加減,看到括號要先算,這個不變的道理。在程式語言裡面也是一樣的,但程式語言內運算子又更多更複雜了,所以當然要向基本運算一樣,幫每個運算子作<span style="color:red">**優先順序跟結合性**</span>的訂定。
## 運算子優先權的重要核心
<span style="color:red;font-size:25px">**全部的運算子在看優先順序時,統一先看優先權高低,再看結合性。**</span>
## 名詞釐清 - 運算元與運算子
100 + 20 = 120
a + b
* 100、20、120 這樣的數字稱為運算元(operand)
* +、= 這樣的符號稱為運算子(operator)
* a、b 這樣的變數也稱為運算元(operand)
請不要搞混,要背熟哦~
## 名詞釐清 - 一元運算子、二元運算子
元代表運算元的意思,一或二就代表這個運算子一次要搭配幾個運算元。
以 `!` 為例,他就是一元運算子,表示 `NOT`,所以我們再打 code 的時候通常會打 `if(!bool_variable)`,這個 bool_variable 是一個布林變數(變數是一個運算元),所以`!`搭配一個運算元。
以四則運算的 `+` 為例,他是二元運算子,所以我們通常會打 `a+b`,你發現它搭配了兩個運算元 `a` 跟 `b`。
以正負號的 `+` 或 `-` 為例,他是一元運算子,正號我們通常會省略,負號我們通常會打 `-10`、`-a`,要搭配一個運算元。
## 名詞釐清 - 結合性
接下來很重要的名詞就是結合性,每個運算子都會有結合性。而結合性有左結合與右結合兩種。
左與右的差別是在做運算的時候從哪邊過去為優先。
### 左結合
基本的四則運算運算子都是左結合。
`3 + 5 + 8 + 10`,因為 `+` 是左結合,所以從左邊優先,他其實是這樣。
`(((3 + 5) + 8) + 10)`
記得看到括號要先算!所以你會發現他是左邊優先一直往右
關係運算子也都是左結合。如 `>`、`>=`、`<`、`<=`
`a > b > c > d`,因為是左結合所以會變成 `(((a > b) > c) > d)`。
其他的像 `==`、`!=`、`||`、`&&` 也都是左結合。
當然還有更多的左結合,可以看下面的參考連結。
### 右結合
右結合只有三類,分別是<span style="color:red">一元運算子、三元運算子、指派運算子</span>
指派運算子像是 `=`、`+=`、`-=`、`*=`、`/=` 等等的這些。
<span style="color:red">**請注意,實際上不會這樣寫下面這樣,我只是幫你了解右結合**</span>
```cpp=
int a = 5, b = 4, c = 10;
a+=b+=c;
cout << a;
```
因為我們知道指派運算子是右結合,所以會像這樣。
`(a += (b += c))`,內層括號會優先算,且右結合,所以會從右邊往左推。
但在實務上程式碼不會這樣寫,太弔詭了。
`a += b += c` 他的運作是:
`a = a + (b += c)`
又可以再拆成
`a = a + (b = b + c)`
你會發現不就是 `a = a + b + c` 嗎...
希望你有充分了解左結合與右結合摟,之所以認真談論這個,是因為<span style="color:red">指標運算很重視優先權跟結合性</span>,所以希望你搞懂!
## 優先權排序
<span style="color:red;font-size:25px">**全部的運算子在看優先順序時,統一先看優先權高低,再看結合性。**</span>
這邊網路上已經有許多大神都已經整理好了,參考連結直接給大家!
可能不是每個運算子大家都了解,趁這個機會知道他們在幹嘛吧,可以多利用 google 哦!
[參考連結 - 1](https://magicjackting.pixnet.net/blog/post/70902861)
[參考連結 - 2](http://programingman.blogspot.com/2015/01/cc.html)
請記得回去看指標的這篇喔,了解指標的運算! -> [pointer 實作一般陣列,以及 1-d dynamic array](https://hackmd.io/@ndhu-programming-2021/B1NUHICaF#%E8%A3%9C%E5%85%85%EF%BC%8C%E9%81%B8%E6%93%87%E6%80%A7%E9%96%B1%E8%AE%80%E6%8C%87%E6%A8%99%E7%9A%84%E9%81%8B%E7%AE%97-pointer-arithmetic)