C詞法陷阱:詞法的“貪心法”

一、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首先得以接合即可。

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