《C陷阱与缺陷》读书笔记

——导读——

词法分析:将程序分解成符号(token)的过程。

——第一章 词法陷阱——

library routine 库函数

Pascal和Ada使用:=做赋值运算符,=做比较运算符

C语言中,赋值符号被作为操作符对待,因此a=b=c正确。

while(c = ' ' || c == '\t' || c== '\n') c = getc(f);其中||的优先级低于=,所以实际是将' ' || c == '\t' || c =='\n'赋值给c,永远为真。

对于要在条件判断中进行赋值,应该进行显式的比较——>if((x = y) != 0) foo();

if((filedesc == open(argv[i], 0))<0) error();——>永远不成立,因为比较结果只能为0或1

C语言对将程序分解为符号的解决方法是“贪心法”:每一个符号应该包含尽可能多的字符。

除了字符串与字符常量,符号之间不能有空白:a --- b 等同 a -- - b 不等于 a - -- b

y=x/*p会将x直接赋值给y,/*会被理解为注释的开始,编译器将会不断读入字符,知道*/出现为止。正确表示方法:y = x / *p;或者 y = x / (*p);

用单引号引起的字符实际代表一个整数,整数值对应该字符在编译器采用的字符集中的序列值。对于采用ASCII的字符集的编译器而言,'a'的含义与0141(八进制)或97(十进制)严格一致。

用双引号引起的字符串,代表只想无名数组起始字符的指针,该数组被双引号之间的字符已经一个额外的二进制值为0的字符'\0'初始化。

整形数(16位或32位)的存储空间可以容纳多个字符,有些C编译器允许在一个字符常量(或字符串常量)中包含多个字符,即‘yes'在大多数编译器中理解为:一个整数值,由'y,'e','s'所代表的整数值按照特定编译器实现中定义的方法的组合得到。Borland C++ v5.5和LCC v3.6中忽略多余字符。Visual C++ 6.0和GCC v2.95后面覆盖前面。

——第二章 语法陷阱——

float f;等同于float ((f));
float *g();因为()的优先级高于*,其等同于float *(g());返回值类型为指向浮点数的指针。
float (*h)();为返回值为浮点类型的函数指针——>(float)(*)())就是其类型转换符。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值