C语言中,经常会有很变态的语法表达,例如 a- - -b;该如何解释?但凡碰到这种情况,加括号就可以完全解决。无奈,面试中,却经常会有这样的题目出现。在阅读《C Traps and pitfall》中,提到了一种分析方法,”贪心法”,可以一劳永逸的解决类似这种问题。
规则很简单:“每个字符应该包含更多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,就再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串不再可能组成一个有意义的符号。这种处理方法,又称为“贪心法”,或者“大嘴法””。
需要注意的是,除了字符与字符常量,符号的中间不能嵌有空白(空格符,制表符,换行等),例如,==是单个符号,= =(=空格=)是两个符号。
有上述分析,可以得出结论,a- - -b与表达式a- - -b 表达结果是一致的,而与
a- --b结果是不同的,测试代码如下:
#include <stdio.h>
int main()
{
int a = 4,b=3;
int temp = a---b;
printf("%d,%d,%d",a,b,temp);
}
输出结果3,3,1
同理,我们可以分析a- - - - - b是不合法的,编译报错:error: lvalue required as decrement operand,自减操作需要左值。
分析,首先根据大嘴法,a- -是一个整体,第三个减号,与第四个减号一起构成另一个自减操作。此时其左边为a- -,并不能作为一个左值,因此报错。