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

发布了24 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gyyu32g/article/details/86410287