程式設計答疑:記不住運算子優先順序怎麼辦?

鹵代烴發表於2019-02-28

最近有幾個初學者問了我幾個程式設計上的問題,我覺得其中一個特別有代表性,拿出來和大家說一下,讓大家避一下坑。

題目的內容是分辨不同運算子的優先順序,大概內容是這樣的:

e = a < d ? a++ : a = d
複製程式碼

然後他問我這種題型怎麼做,有什麼口訣可以記住多個運算子的優先順序。

我的答案很簡單,不需要記憶

不要著急反駁,先看了下文再說。

先舉一個簡單易懂的例子。大家做數學題的時候,有沒有寫過這樣的計算式:

1 + 2 - (3 * 4 / 5 + 6^7) - 8 * ln9 + 10
複製程式碼

一行寫了五六個運算子,有好幾個層次的優先順序,最後算出來一個答案。

我保證你這樣寫會被數學老師追著打:你不要步驟分了?

程式設計答疑:記不住運算子優先順序怎麼辦?

寫程式碼一個道理,這麼多運算子混在一起,萬一哪裡出錯了,你一時都查不出來錯在哪裡。

我們再看一張表,下圖列舉了 C++ 的所有優先順序,嗯,18 個,我又不是編譯器,反正我記不住。

程式設計答疑:記不住運算子優先順序怎麼辦?

隨著工作經驗的豐富,你會用不止一門的語言。最關鍵的是,不同語言的運算子優先順序不一樣,(比如 C 和 C++)當你同時寫幾門語言時,優先順序往往會記混,這時候記憶毫無卵用。

所以解決這個問題的唯一辦法是加括號查文件

加括號很容易理解,因為括號運算級最高,至今我還記著小學老師 “先算括號內,再算括號外” 的諄諄教誨,能用加括號解決的問題都不是問題。

當你括號加多了,你會發現可讀性也會變得很差:

1 + 2 - (((3 * 4) / 5) + (6^7)) - (8 * ln9) + 10 // WTF???
複製程式碼

這時候你就得學會拆分程式碼,儘量不要一個表示式涉及多層優先順序。

查文件就更簡單了,哪裡不會查哪裡,媽媽再也不擔心我的學習。給大家推薦一個非常好用的查文件軟體:DevDocs,不清楚的語法和 API 都可以一鍵搜尋,無敵強大了。

程式設計答疑:記不住運算子優先順序怎麼辦?

線上版本

桌面版本

國內網速慢的同學可以在在微信公眾號【鹵代烴實驗室】後臺回覆【DevDocs】獲取最新的軟體更新,內含 Mac 和 Win 兩系統版本,可按需下載。

按道理來說,文章寫到這裡就結束了,其實下面才是我說的重點。

我發現大部分初學者學習程式設計時,經常會陷入死衚衕,過於關注符號。比如說你想讓一個變數自增加一,你寫成 i++++ii += 1,i = i + 1其實都可以達到目的,上手寫程式碼時挑一個業內最公認的寫法就行,但是總有人認為這些是真知識,另一個問題是學校考試很偏門,考的就是你「茴」字的四種寫法,你不能說它沒用,但是這些細枝末節的東西對於初學者真的幫助不大。

初學者最關注的是程式設計是什麼?無非是語言能做些什麼,能不能上手做些小玩意兒。但很多入門書只止步於 “這門程式語言的語法是什麼” 以及 “怎麼用這門語言在螢幕上列印出一顆楊輝三角”,WTF ?

由此我才會在「初學者最適合的圖書」裡推薦《 python 程式設計:從入門到實踐》,這本書是非常適合初學者學習的,可以最大的解決初學者的問題,另外給大家推薦一篇博文《解謎電腦科學》,它可以最大程度上解決初學者 “電腦科學是個什麼玩意兒” 的問題。

另一個問題可能是初學者黑客題材的電影看多了,一屏花花綠綠的字元,一個 Geek 上天入地無所不能,伴隨著電腦上一個華麗麗的進度條,總能在最後關頭解決危機。這樣給人的印象就是程式設計是一個非常酷炫非常需要智力的工作,由此程式碼也要寫的酷炫。

程式設計答疑:記不住運算子優先順序怎麼辦?

什麼最酷炫?當然是別人看不懂最酷炫。不能人眼識別運算子優先順序算什麼高手?不能徒手寫彙編算什麼高手?這就是典型的沒有公主命得了公主病,我覺得初學者寫程式碼應該牢記一點:程式碼是給人看的,不是給機器看的

無論是團隊合作,還是個人獨立專案,編寫修改程式碼的永遠是人。這時候通俗易懂的程式碼才是最重要的,這樣合作才能最大提高效率。

而在機器看來,你把一個變數取名為 「'wtf'」 或者 「'o(≧v≦)o~~'」 或者 「?」 都沒有問題,在機器看來都是 01 的排列組合,都是 CPU 上跳動的高低電平,他們根本不 care 這些。一味著最求酷炫最後只能挖坑坑了自己。

上面就是一些我的經驗之談。程式設計其實是個很簡單的手藝,學會他一點兒都不難,你感覺困難主要是小時候沒有接觸 + 學校的垃圾教材,只要有些恆心,找好教材,入門真的很容易。


相關文章