傳智播客旗下品牌:|||||

全國咨詢/投訴熱線:400-618-4000

C語言運算符優先級詳解[C++培訓]

更新時間:2020年03月31日17時29分 來源:傳智播客 瀏覽次數:

最近在知乎上看到一個c/c++運算符連寫的問題,引發了諸多網友的討論,具體內容如下圖:

1585644820446_C++優先級01.jpg


乍一看,這句代碼很長,確實有些讓人糊涂,尤其是學習過python的同學,對此寫法不太理解,今天我們一起來說一說。推薦了解傳智播客課程。


優先級

在c語言的表達式中,如果存在多個運算符的時候,需要考慮數據的優先級和結合方向的問題,例如:x = a + b * c -d在這個例子中,c語言的處理流程是:

1)先做乘法b*c,

2) 然后先做加法,后做減法

3)最后將計算結果賦值給x

我們驗證一下:

1585644832744_C++優先級02.jpg


1 + 2 *3 -4,結果為3,驗證成功!

1585644841823_C++優先級03.jpg


通過這個例子,我們可以總結如下:對于表達式

a op1 b op2 c ,它的運行邏輯有兩種可能性:

1) 如果op1優先級高于op2,則為:(a op1 b) op2 c

2) 如果op2優先級高于op1,則為:a op1 (b op2 c)

如果op1與op2優先級相同,則取決于結合方向。所謂結合方向指的是“從左至右”或“從右至左”。

結合方向

關于結合方向,我們一起來探討一下,還是剛剛的例子:x = a+b *c -d,這里面有二元運算和賦值運算,在c語言中:

· 賦值運算的結合方向為:從右至左

· 二元運算符的結合方向為:從左至右

我們假設 b*c 的值為m,則,

· a + m -d 可以翻譯為 (a + m) -d,,結合方向是從左至右

· x = a + m -d 可以翻譯為: x = (a + m -d),結合方向是從右至左

在C/C++中,所有的運算符都有明確的優先級和結合方向定義,具體如下:

1585644856832_C++優先級04.jpg


問題解答

鋪墊好了知識點,我們回歸到最初網友的問題上,x +=5 ==4,

由于==號的優先級大于+=號,所以這句代碼的邏輯可以解讀為:

1) x += (5 ==4)

2)即先判斷 5 == 4是否成立,此時不成立,返回false,即返回0

3)然后再計算x+=0,所以最終結果為0。

使用代碼驗證一下:

1585644866483_C++優先級05.jpg


執行結果:

1585644875985_C++優先級06.jpg

可以看到,輸出的結果依然為10,說明x添加的值為0,得到驗證。

接下來,我們修改一下代碼,讓兩個數字比較值返回true,再次驗證一下結果,如下圖:

1585644885402_C++優先級07.jpg


執行結果:

1585644893538_C++優先級08.jpg


進一步思考

對于這種x +=5 ==4表達式的編碼風格,我們在開發中是不建議的,這樣寫雖然高效簡潔、正確運行、看起來很酷,但是存在一個風險,即需要人進一步確認這種表達式是否就是開發人員的真正意圖。我們在公司開發的時候,通常是很多同事協同開發,當同事看到這類代碼的時候,會產生懷疑,從而增加彼此的溝通成本。我們在編碼的時,盡量不要讓人產生歧義,如果一定想要寫這種風格的代碼,我建議加上括號,即:x +=(5 == 4),這樣語義更加明確,從而也避免造成同事因揣摩代碼而帶來的苦惱。

當然,深刻的理解語法是我們必須要做到的,這種代碼常見于面試題中,對于考察面試者對語法的理解程度是個不錯的選擇。

猜你喜歡
C++學科之零基礎視頻教程

互联网赚钱 2019比较好网赚项目 e畅家园网赚 上网赚美金平台 广东快乐十分 网赚平台哪个赚钱快点 2019最赚钱的网赚 互联网赚钱机器 微信pk10机器人漏洞 河北11选5开奖