C词法陷阱:词法的“贪心法”

本文深入探讨了C语言中的词法分析贪心法,通过具体实例解释了单目运算符如何组合及解决运算符组成的矛盾,展示了从左至右读取字符并形成有效符号的规则,以及这一规则在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值