前言
在程序中单个字符是没有意义的,只有结合上下文才能知道具体的意思。换句话说,就是字符本身的意义是不变的,但组成符号的字符有它的顺序,同一组字符序列在不同上下文环境中的意思也不同。
-
上面的话看起来很拗口,举例解释一下
p->s = "->";
-
上述语句中有两个符号'->'。首先对于字符'-'和'>'来说本身的意思不变,就是一个普通的字符,有自己对应的ASCII值。然后就是第一个'->'表示的是指针引用,第二个'->'是字符串。
第一章词法“陷阱”,主要探讨符号与组成符号的字符之间的关系,以及一些符号含义的常见误解。在编译器中,词法分析器将程序分解成一个个符号。
一、=不同于==
-
在有的编程语言中以符号:=作为赋值运算符,符号=作为比较运算符。而C语言是以符号=作为赋值运算符,符号==作为比较运算符来使用的。
-
这就导致了一个问题:在进行比较运算的时候,错误的把==写成=
-
解决办法:进行比较运算的时候把比较的对象写在前面(一般是与数值进行比较)
-
如下所示,在将100与x进行比较时,写成100==x,这样就不会错写成100=x。如果是以常规的方式写成x==100,很容易写成x=100
int x = 10;
if(100 == x)
printf("真厉害!!!");
二、&和|不同于&&和||
-
C语言中的按位运算符很容易与逻辑运算符混淆
-
记住:位运算是& |,逻辑运算是&& ||
三、词法分析中的“贪心法”
-
在C语言中,只有一个字符组成的符号称为单字符符号,那么包含多个字符的就是多字符符号
-
C语言编译器在读入字符时会遇到这样一个问题:我要读多少字符才可以结束???读多少字符组成一个符号???
-
解决办法:每个符号应该包含尽可能多的字符
-
在这里我们再深入了解一下编译器将程序分解成符号的方法:从左到右一个字符一个字符读入,如果这个字符可能组成一个符号,继续读入下一个,判断该字符能否与之前读入的共同组成一个符号;如果可以就继续读入,重复上述操作,直到读入的字符组成的字符串不可能组成一个有意义的符号
-
以上就是“贪心法”
-
还需要注意除字符串与字符常量,符号的中间不能有空白(空格符、换行符、制表符)
四、整型常量
-
一个整型常量的开头是数字0,则该常量被视为八进制数
-
一个整型常量的开头是0x,则该常量被视为十六进制数
五、字符与字符串
-
用单引号引起的一个字符实际上代表一个整数,对应的ASCII值。如'a'的含义与97严格一致
-
用双引号引起的字符串代表的是一个指向无名数组起始字符的指针。如字符串“Hello world\n”,以数组形式表示就是hello[ ] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n', '\0'}
总结
-
对于词义“陷阱”来说,我觉得其实还是在程序编写的过程中,对于变量、函数名等的定义,避免引起二义性
-
对于C语言本身自带的操作符的使用也要注意