tags: 大一程設-下 東華大學 東華大學資管系 基本程式概念 資管經驗分享

運算子的優先權

前言

在任何的程式語言裡面,都有運算子,如 + - * /,我們在學數學的時候都知道,先乘除後加減,看到括號要先算,這個不變的道理。在程式語言裡面也是一樣的,但程式語言內運算子又更多更複雜了,所以當然要向基本運算一樣,幫每個運算子作優先順序跟結合性的訂定。

運算子優先權的重要核心

全部的運算子在看優先順序時,統一先看優先權高低,再看結合性。

名詞釐清 - 運算元與運算子

100 + 20 = 120

a + b

  • 100、20、120 這樣的數字稱為運算元(operand)
  • +、= 這樣的符號稱為運算子(operator)
  • a、b 這樣的變數也稱為運算元(operand)

請不要搞混,要背熟哦~

名詞釐清 - 一元運算子、二元運算子

元代表運算元的意思,一或二就代表這個運算子一次要搭配幾個運算元。

! 為例,他就是一元運算子,表示 NOT,所以我們再打 code 的時候通常會打 if(!bool_variable),這個 bool_variable 是一個布林變數(變數是一個運算元),所以!搭配一個運算元。

以四則運算的 + 為例,他是二元運算子,所以我們通常會打 a+b,你發現它搭配了兩個運算元 ab

以正負號的 +- 為例,他是一元運算子,正號我們通常會省略,負號我們通常會打 -10-a,要搭配一個運算元。

名詞釐清 - 結合性

接下來很重要的名詞就是結合性,每個運算子都會有結合性。而結合性有左結合與右結合兩種。

左與右的差別是在做運算的時候從哪邊過去為優先。

左結合

基本的四則運算運算子都是左結合。

3 + 5 + 8 + 10,因為 + 是左結合,所以從左邊優先,他其實是這樣。
(((3 + 5) + 8) + 10)

記得看到括號要先算!所以你會發現他是左邊優先一直往右

關係運算子也都是左結合。如 >>=<<=
a > b > c > d,因為是左結合所以會變成 (((a > b) > c) > d)

其他的像 ==!=||&& 也都是左結合。

當然還有更多的左結合,可以看下面的參考連結。

右結合

右結合只有三類,分別是一元運算子、三元運算子、指派運算子

指派運算子像是 =+=-=*=/= 等等的這些。

請注意,實際上不會這樣寫下面這樣,我只是幫你了解右結合

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

希望你有充分了解左結合與右結合摟,之所以認真談論這個,是因為指標運算很重視優先權跟結合性,所以希望你搞懂!

優先權排序

全部的運算子在看優先順序時,統一先看優先權高低,再看結合性。

這邊網路上已經有許多大神都已經整理好了,參考連結直接給大家!

可能不是每個運算子大家都了解,趁這個機會知道他們在幹嘛吧,可以多利用 google 哦!
參考連結 - 1
參考連結 - 2

請記得回去看指標的這篇喔,了解指標的運算! -> pointer 實作一般陣列,以及 1-d dynamic array