C语言的贪心

July 13, 2013
作者:星爷
出处:http://lxWei.github.io/posts/c-e8-af-ad-e8-a8-80-e7-9a-84-e8-b4-aa-e5-bf-83.html
声明:转载请注明作者及出处。

例:当C编译器读入一个‘/’,后面又跟着一个‘*’,这时候,编译器需要做出判断:

* 将'/'和'*'当作两个符号分别对待;
* 将'/'和'*'合起来当一个符号对待。

在C语言中,处理这个问题可以用“每一个符号应该包含尽可能多的字符”这条规则来判断,称为“贪心法”,K&R在曾对这个方法做了如下描述:

如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该符号之后可能组成一个符号的最长字符串。

贪心法很好理解,但由于不良编写习惯,很可能给程序带来一些隐藏的bug,举例如下:

x = y / *p;

x = y/*p;

是完全不同的两个表达式,第一个语句表示p是除数,而第二个语句“/”开始表示注释,如上式编辑器还能发现错误,但如果改成这样:

x = y/*p    /*  p是指向除数的指针 */ ;

编译器就发现不了了错误了。

再举个例子,表达式:

a---b

表示什么呢?

根据贪心法,表达的意思应该是a– -b;但作者本来的意思很可能是a- –b,see?这就出问题了。

可以看出,良好的编码风格,合理运用空格、制表符和换行符,不仅使程序易读,也能防止很多意外bug的出现。