1. 词法“陷阱”
- = 不同于 == , 可以通过
if( 1 == a )
来避免 & | 不同于 && ||
词法分析中的“贪心法”
整型常量
10
不等于010
- 字符与字符串
- 某些C编译器允许嵌套注释 。写一个测试程序:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译,但含义却不同。
2. 语法“陷阱”
理解函数声明
运算符的优先级问题
- 注意作为语句结束标志的分号
struct logrec{};
switch语句 case穿透
break;
函数调用
“悬挂”else引发的问题:else始终与同一对括号内最近的未匹配的 if 结合;代码缩进
C语言允许初始化列表中出现多余的逗号,如
int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, };
3. 语义“陷阱”
指针与数组
非数组的指针
作为参数的数组声明
空指针并非空字符串
边界计算与不对称边界
求值顺序
整数溢出
为函数main提供返回值,return 0; 或 exit(0);
4. 连接
什么是连接器
声明与定义
命名冲突与static修饰符
形参、实参与返回值
检查外部类型
头文件
5. 库函数
- C语言没有定义输入/输出语句,通过库函数实现输入/输出操作
- 返回整数的 getchar 函数,否则,无法和 EOF(int类型)比较
- 缓冲输出,函数
setbuf(stdout, buf);
常量BUFSIZ
- 使用外部变量errno检测错误
- 库函数signal
6. 预处理器
不能忽视宏定义中的空格:这一规则不适用于
宏调用
,只对宏定义
适用宏不是函数
宏并不是语句
- 宏并不是类型定义(使用#define创建的“新类型”当含有指针* 时会出问题),类型定义使用typedef
7. 可移植性缺陷
整数大小
字符是有符号整数还是无符号整数
内存位置0
大小写转换
移位运算符
除法运算时发生的截断