C语言

C3. 贪心法

2020-07-09  本文已影响0人  开源519

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读