C经典书籍笔记——C缺陷与陷阱①(词法陷阱)

目录

 一、前言

二、==不同于=

案例1.错把==写成=

案例2.错把=写成==

三、词法分析中的贪心法

案例1. 

四、整形常量

五、字符与字符串 

六、练习


扫描二维码关注公众号,回复: 13474866 查看本文章

 一、前言


二、==不同于=

案例1.错把==写成=

while(c=''||c=='a'||c=='b')
{c=getc(f);}

分析:由于‘ ’ASCLL码值不为0,程序可能会陷入死

建议:好的习惯是写成   ‘ ’==c  这样可以避免我们的失误

反思:当我们确实需要写出类似 “if(x=y)” 这样的语句时,为了避免报错,也为了使得程序目的一目了然,应该写成 "if((x=y)!=0) "

案例2.错把=写成==

if(field==open(x,y)<0)

分析:==的返回值为0或1,使得if语句失去作用,也使得field失去了储存返回作用

 (同理注意& 和 | 与&& 和 ||)


三、词法分析中的贪心法

思考:如当编译器读入一个符号'/'后又读入一个符号'',编译器如何看待第二次输入的符号'*',是分开处理,还是看成‘/*’

对此编译器采用贪心法(也叫大嘴法)进行处理

贪心法:基本原则一个符号应该尽可能包含更多的字符,即在输入一个可能成为符号的字符后继续读入下一个字符,判断两个字符组成的字符串能否组成一个符号,重复上述过程,直至不能组成一个可能的符号

注意符号之间不能留有空白,如==与= =不同

案例1. 

int main()
{
	int a = 10; int b = 5;
	int *p = &a;
	int c = b/*p;
	return 0;
}

/与*根据贪心法,组合成 '/*' 后面的内容都被认作是注释的内容,直到输入*/结束


四、整形常量

如 ‘’010”这样的形式会被认为是八进制,有时为了结构对齐而输入数据时注意


五、字符与字符串 

总结:1.单引号内的字符实际上表示一个整数,其值对照ASCLL码表

           2.双引号内的字符串,表示的是一个指向无名数组的指针,该数组被双引号间的字符和额外的0赋值(所以我们也就可以用字符指针实现对字符串内内字符的一一访问)

 【因此“yes”被认为是一个数组依次存入‘y’‘e’‘s’‘0’ 而‘yes’则被认为是一个整型值,如果将‘yes’放入char n内时发生从int到char的截断】

:因为一个整形大小在2~4字节,所以可以放入多个字符)


六、练习

例1:a+++++b的含义什么

分析:根据贪心法,++组合后再一次++最后以为((a++)++))+b

例2:为什么n-->0的结果是n--  >0而不是n- ->0?

分析:同样根据贪心算法,尽可能的多组合


上述内容为作者对重点的总结,难免残缺,想了解完整内容,还请看原著。日更ing……

猜你喜欢

转载自blog.csdn.net/whc18858/article/details/120074748