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. 总结

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 贪心法是从问题的某一个初始解出发,向给定的目标递推。推进的每一步要做一个当时看似最佳的贪心选择,不断地将问题实例归...
    阳光的技术小栈阅读 506评论 0 0
  • 一、贪心算法简介: 贪心子结构是独立的(往往用标志判断而已),不同于动态规划(后面每一边的计算要用到前一步的值,另...
    交大小丑阅读 552评论 0 0
  • 码字不易,对你有帮助 点赞/转发/关注 支持一下作者微信搜公众号:不会编程的程序圆看更多干货,获取第一时间更新代码...
    不会编程的程序圆阅读 224评论 0 0
  • 概述 贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好...
    jiaji_3740阅读 3,891评论 0 1
  • 夜莺2517阅读 127,761评论 1 9