C3. 贪心法

1.介绍

所谓贪心法,是c语言针对c程序组合符号(“==、++、--、+=等”)结合上下文识别的一种方法。“每个字符应该包含更多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,就再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串不再可能组成一个有意义的符号。这种处理方法,又称为“贪心法”,或者“大嘴法””。

举个“栗子”

int main(void)
{
    int a[6] = {10,2,10,2,10,2};

    printf("%d --- %d = %d\n",   a[0], a[1], a[0]---a[1]);
    printf("%d - -- %d = %d\n" , a[2], a[3], a[2]- --a[3]);
    printf("%d -- - %d = %d\n" , a[4], a[5], a[4]-- -a[5]);
}

看一下程序执行出来的结果:

输出.png

是不是感觉很简单的代码,输出的结果却与想象的大相径庭呢?

2. 分析一下输出结果:

第一行输出:
根据贪心法规则,a[0]---a[1]会形成a[0]-- -a[1],由于a[0]--的结果是在运算后执行,所以这个表达式的值为8。那么为什么是9 --- 2而不是10 --- 2呢?这就跟printf的执行顺序有关了,其是从右向左执行,当a[0] --- a[1]完全执行完才会打印,而打印时,a[0]--已经执行完毕,所以此时a[0]打印出来的的值为9。

第二行输出:
先执行--a[3],此时a[3]值为1,再执行a[2]- a[3],所以表达式值9。输出结果为10 - -- 1 = 9。

第三行输出:
与第一行相同。

3. 总结

在码代码时,我们很容易出现多打一个-这种疏忽,而这种问题编译器并不会报错,从而导致代码执行无误,但是结果却与预期相差较大。了解编译器贪心法,对于以后规避错误很有帮助!

记录历经的路,分享个人总结与感悟。欢迎关注公众号“嵌入式漫漫修道路”获取学习资料及经验文档,也欢迎与笔者共同探究技术问题。

嵌入式漫漫修道路

个人总结,转载请标明出处及链接,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拂去尘世尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值