过网而居,点点滴滴

我的IT日记------冲刺流星 isaacct@163.com

IT博客 联系 聚合 管理
  13 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks
ch6  关于宏
1。为什么要用宏?构建一个类似于函数的功能块,在经常调用的环境中是直接嵌入的,保证了速度,而不是像函数那样费时。比如getchar()
2.宏定义的空格问题,容易被忽略而产生郁闷的错误,好在编译器一般会报错
3。为了避免表达式误解,定义宏的时候必须将表达式用(),否则产生的错误将很难发现
4。宏定义中加入运算符,很有可能造成误解
如  max(a,b)换成了max(biggest,x[i++])
++和--的副作用很大
5。应该考虑在宏展开后会不会产生庞大的表达式,才决定要不要使用宏
6。宏不应该写成语句,而仅写一个表达式就可以了,否则容易产生悬挂else的问题
7。如果使用宏定义一个类型指针,一次只能定义一个变量
如  #define t1 struct foo *
      t1 a,b  //这样a,b就不是一个类型了,此处应小心

ch7  预处理器和可移植
1。为了兼容旧版本的C,有些规范容易造成不合理的错误
比如 square( )函数不检查参数
2。有些C编译器环境不区分大小写的变量,因此尽量不要使用同名字的变量,在小型的程序中可以加起个人前缀来实现
3。在将字符串转化为整数时应该严格的转化为无符号整数,因为有些机器可能把字符串作为16位整数的高8位或者低8位存储,转化之后会造成错误
4。对于有符号数,移位运算标准并不规定补充位的值,有些机器按0补充,有些则按溢出的值补充。移位运算的允许值 0<=x<n.当然,可以在二分查找法中对无符号数进行移位,以节省时间(除法尽量不要用)
5。有些编译器可以对内存0位置读写,有些不能
6。执行处罚应该尽量避免被除数为负,这样容易溢出产生错误结果
7。对大小写字母的实现
A。#define toUpper(c) ((c)+'A'-'a') :只对传入值为字母时产生效果,如果为其他,会产生垃圾信息
B。用函数实现:速度慢但是质量高
应该根据应用选择细节
8。内存分配问题
malloc  分配新的内存
realloc  分配原有内存,早期版本的realloc要求先被释放才能分配
9。'0'+n得到字符n,是在ASCII和EBCDIC规范下的,注意有些机器不是在这个字符集下
10。类似 a=-a 这样的表达式,应注意,改变一个负数的符号可能发生溢出

作者对C程序员的建议
*尽量不要用指针
*应该使用程序集
*要使用类

这不是叫人去学面向对象么。。。

posted on 2006-11-20 21:29 冲刺流星 阅读(243) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。