一、C的语言特性
1. 多做
1)switch语句,switch语句不会在每个case执行完毕后自动终止(称为fall through),这也是每个case语句最后加上break的原因;break语句跳出的是最近的循环语句或switch语句;
2)相邻字符串自动连接,尤其在字符指针数组的初始化中,少了逗号会使两个字符串拼接在一起;
3)缺省全局范围,当我们自己定义一个与库函数同名的函数时,会取而代之,不管在自己调用还是系统调用时,具体见“三、连接与链接”;
2. 误做
1)C 语言的简洁性 ,C关键字在多种上下文中使用,即符号重载,如static、&、()、void等
2)运算符的优先级,优先级存在的问题:
a. .的优先级大于*,->操作符用于消除这个问题;
b. []的优先级高于*;
c. 函数()高于*;
d. ==和!=高于位操作符和赋值符;
e. 算术运算高于移位运算;
f. 逗号运算符在所有运算符中优先级最低;
3)gets()函数接收任意长的参数会改写函数栈,超过的长度会污染别的栈帧(函数调用时的内存分配过程,以后详细看CSAPP);
3. 少做
1)命令行参数解析,选项开关"-"与文件名中的“-”混淆;
2)空格引发的血案
a. 多了空格,行末最后一个字符“\”后跟上换行符标识下一行为本行的后续,警惕“\”和换行符之间的空格;
b. 少了空格,造成歧义,例如z=y+++x,将被解析为 z= y++ + x;
c. ratio = *x/*y,错误地编写了一个注释符号,语法器(?)报错;
3)函数返回指向局部变量的指针,(C语言中自动变量在堆栈中分配内存,生命周期结束时回收);
a. 返回一个指向字符串常量的指针;
b. 使用全局声明的数组;
c. 使用静态数组;(静态变量在静态数据区分配内存,深入看内存空间模型);
d. 显示分配一些内存,保存返回的值;(感觉最常用到,每次调用都创建一个缓冲区,但需要记得释放,否则会导致内存泄漏);
e. lint程序(?);
二、C语言的声明
1、声明的结构
1)声明器:零个或多个(指针)+ 有且只有一个(直接声明器) + 零个或一个(初始化内容);
2)声明:至少一个(类型说明符) + 有且只有一个(声明器)+ 零个或多个(,+更多的声明器ÿ