一、C語言的詞法分析中的“貪心法”
導論:C語言中有很多單目運算符號,但是這些單目運算符可以組成很多運算符,當這些運算符的組成產生矛盾時,應該按照:從左到右一個字符地讀入,如果這些字符可以組成一個符號,那麼可以再讀下一個字符,依次類推,這叫做C語言詞法分析法中的“貪心法”。`
如:
int a = 3;
int b = 0;
b = a---1;
printf("The result is b = %d\n",b);
其結果是:b = 2。
原因:由於從左到右,a–先結合成爲一個符號,所以實質上是a-- -1,也就是說這個表達式先執行a–,由於是a–(a最後才進行自減),故表達式爲b = 3 - 1 = 2,故其結果爲2。
又如:
int a = 3;
int b = 0;
b = --a-1;
printf("The result is b = %d\n",b);
其結果是:b = 1。 原因:由於從左到右,–a先結合成爲一個符號,故–a的結果是a先進行自減,故爲a = a - 1 = 2,然後再進行 b = a - 1,故其結果是1。
再如:
int a = 3;
int b = 0;
int *p = &a;
b = a/*p;
仔細的小夥伴會發現,其實這裏b = a/*p;是有問題的,由於從左至右符號的結合規則,這個符號先結合成爲註釋符號的座標,所以會出現下面代碼都變成註釋的問題,所以應該改成:
b = a / *p;
/與*之間間隔一個空格避免結合成爲註釋符號,或者改成:
b = a /(*p);
加一個括號使得*p首先得以接合即可。