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

  • 大小写转换

  • 移位运算符

  • 除法运算时发生的截断

04-26 23:47