C/C++中的運算符和表達式

在運算符重載https://blog.csdn.net/nameofcsdn/article/details/104603352一文中,我提到了運算符的2個性質:

優先級和結合性。

結論:

決定運算符的運算順序,需要且只需要2個規則,一個是優先級,一個是結合性

所以優先級相同的運算符,要麼全是左結合性,要麼全是右結合性

實際上,C和C++中,優先級分爲十幾級,右結合性只有其中的三個等級,即三類運算符:單目運算符、三目運算符、賦值運算符

 

然而,如何理解a---b?是a - --b還是a-- - b?

這裏就涉及到編譯原理中的分詞原則,分詞是從左往右最長匹配的貪心原則

根據貪心原則,a--b就是a-- b,是無法編譯的,無法理解爲a - -b,因爲先分詞後才能按照高級語言的語法來編譯。

而a---b就是a-- - b

有了這個原則,表達式想表達的意思就沒有歧義了。

比如---b這個表達式,就是-- -b,這也是無法編譯的。

 

然而,--的優先級比-高,但是a-- -b是先計算a-b,再計算a--,這怎麼理解呢?

我的理解是,運算符的優先級和結合性,其實是規定了如何添加括號,而無論如何添加括號,後置++和--依舊是在表達式計算完成之後才能計算。

PS:除了C++中的作用域解析運算符::之外,括號()的優先級是最高的。

 

順帶一提,a--+-+-b這個表達式如何理解?

答案是a-- + - + -b

加減號放在變量之前,也可以表示正負號,不難發現,這2個不需要什麼規則做明顯的區分,這個是沒有歧義的。

和數學是一致是,3-5可以理解爲3和-5這2個數的和,因爲負數的定義就是如此,而且數學中也有3- -5和3- +5這種表達,是完全一致的,無論是數學還是C/C++中,這個都是沒有歧義的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章