C经典书籍笔记——C缺陷与陷阱①(词法陷阱)
Posted 罅隙-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C经典书籍笔记——C缺陷与陷阱①(词法陷阱)相关的知识,希望对你有一定的参考价值。
目录
一、前言
二、==不同于=
案例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……
以上是关于C经典书籍笔记——C缺陷与陷阱①(词法陷阱)的主要内容,如果未能解决你的问题,请参考以下文章