前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >贪心法

贪心法

作者头像
开源519
发布2020-09-14 16:55:22
3750
发布2020-09-14 16:55:22
举报
文章被收录于专栏:开源519开源519

1

介绍

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

举个“栗子”

代码语言:javascript
复制
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]);
}

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

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

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

总结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源519 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档