詞法分析——運算符的解析


這篇文章主要講的是《C陷阱與缺陷》中第一章習題1-3與1-4。

習題1-3:為什么n-->0的含義是n-- > 0,而不是n- -> 0 ?

習題1-4:a+++++b的含義是什么?

在回答這兩個題目之前,我們先回顧下1.3節的內容,該節主要講的是詞法分析中的”貪心算法“:

編譯器將程序分解成符號的方法是:從左到右一個字符一個字符的讀入,如果該字符可能組成一個符號,那么再讀入下一個字符,判斷已經讀入的兩個字符組成的字符串是否可能是一個符號的組成部分;如果可能,繼續讀入下一個字符,重復上述判斷,直到讀入的字符組成的字符串已經不再可能組成一個有意義的符號。這個處理策略被稱為“貪心法”或者“大嘴法”。

 

通過優先級表查找,我們知道->的優先級高於--,所以,如果按照優先級策略,對於1-3表達式n-->0應該表達的是n- -> 0而不是n-- > 0!

++的優先級高於+,對於1-4的含義可能被理解成(a++) + (++b),而不是((a++)++)+。

但是有了詞法分析原理后,我們就能理解表達式n-->0為啥是n-- >0,而不是n- ->0了。因為從左至右,先判斷的是--符號。同理a+++++b的含義是((a++)++)+。

 

對於1-4題,還涉及到左值與右值的概念,通過編譯會發現a+++++b編譯出錯!

錯誤提示:lvalue required as increment operand(增操作數必須是左值。使用vs提示error C2105: “++”需要左值)

左值與右值含義:左值就是可以在"="左邊,能被賦予值的東西;右值則是在"="右邊,可以賦值給別人的東西。所以左值必須是有內存空間的東西;而右值則既可以是變量,也可是常量和某種表達式,只要能提供一個值即可

 

C++ PRIMER自增和自減操作符講解:

int i =0, j;
j = ++i; // j = 1, i = 1
j = i++; // j = 1, i = 2

前置操作符返回加1后的值,所以返回對象本身,這是左值;后置操作符返回的則是右值,即是它的一個副本;

 

詞法分析,a+++++b=((a++)++)+b,(a++)返回的是右值,而(a++)++沒有提供左值存放的空間,故編譯器會提示錯誤!

其他示例:對於++a+++b,同樣會報錯,原因是:++運算符是從右到左結合,故計算順序為(++(a++))+b,同樣a++為右值,不能作為左值出現!

而例子:(++a)+++b,則可以計算!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM