第一章
1.1简介
从逻辑上删除一段代码,可以用注释( /* */)
更好的方法是使用#if语句,例如:
#if 0
statements
#endif
函数声明中,函数原型中形参的名字并非必须,如:void lan(int,int)
NULL指一个其值为0的指针,在头文件中“stdio.h”中定义
int read_number(int column[],int max)在函数声明的数组参数中,并未指定数组的长度,这种格式是正确的
getchar()从标准输入中读取一个字符并返回它的值,如果输入中不存在任何字符,函数就会返回常量EOF(在stdio.h中定义),用于提示文件的结尾
C可以把赋值操作蕴含在while语句内部,这样就允许程序员消除冗余语句,例如
int ch;
while((ch=getchar()) != EOF&&ch != ‘\n’)
用一个整形变量来容纳一个字符值不会引起任何问题
1.2 补充说明
strncpy(), 如果源字符串的字符数少于第三个参数指定的字符数量,目标字符串中剩余的字节将用NUL字节填充
strcpy,strcat的第一个字符串参数不能是字符串常量
1.6 编程提供的总结
使用#include指令避免重复声明;
使用#define指令给常量取名;
始终要进行检查,确保数组不越界
第二章 基本概念
2.1 环境
编译由几个阶段构成:预处理,解析,
翻译的目标文件名,在UNIX中为.0,在DOS中为.obj
三字母词就是几个字符的序列,合起来表示另一个字符,例如:
??< { ??( [ ??= #
??> } ??) ] ??/ \
转义字符使某些无法打印的字符得以表达,例如在程序中包含某些空白字符
\?在书写多个连续问号时使用,防止被解释成三字模‘
\”用于表示字符串常量内部的双引号
\’用于表示字符常量’
2.2 词法规则
注释(/* */)不能嵌套在另一个注释里
所有的注释都会被预处理器拿掉,取而代之的是一个空格,因此。注释可以出现在空格出现的所有地方
2.4 总结
一个C 程序的源代码可以保持在一个或多个源文件中,但一个函数只能完整地出现在同一个源文件中
第三章 数据
3.1 基本数据类型
C语言中4种数据类型:整型,浮点型,指针和聚合类型(结构体,数组)
当可移植问题比较重要时最佳方案是把存储于char型变量的值限制在signed char,unsigned char的交集中
一 整型字面值
在缺省情况下,字面值类型就是上述类型中最短但足以容纳整个值得类型
二 枚举类型
声明为枚举类型的变量实际是整数类型
三 指针
不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个地址,而不是这些字符本身
3.2 基本声明
声明指针
警告:
3.2.3int *a,b,c;
*实际是*b的一部分,只对这个标识符有效,b是一个指针,其余两个变量只是普通的整型
3.2.4 隐式声明
不能依赖隐性声明
3.3 typedef
应该使用typedef而不是define来创建新的类型名,因为后者无法正确处理指针类型
3.5 作用域
4种不同类型的作用域:文件作用域,函数作用域,代码块作用域,原型作用域;
标识符声明的位置决定它的作用域
3.5.1 代码块作用域
如果内层代码块有一个标识符的名字与外层代码块的一个标识符同名,内层的那个标识符将隐藏外层的标识符(我们要避免在嵌套的代码块中出现同样的变量名)
3.5.2文件作用域
任何在所有代码块之外声明的标识符都具有文件作用域
3.5.3原型作用域
只适用于在函数原型中声明的参数名
3.6 链接属性
标识符的链接属性决定如何处理在不同文件中出现的标识符
链接属性一共有三种—external,internal,none
没有链接属性的标识符(none)多个声明被当作独立不同的个体
属于internal链接属性的标识符在同一个源文件里的所有声明中都指同一个实体,位于不同源文件的多个声明则分属不同的实体
属于external属性的标识符不论声明多少次,位于几个源文件都表示一个实体
如果某个声明在正常情况下具有extern 属性,在它前面加上static关键字,可以使它的链接属性变成internal
当extern关键字用于源文件中第一个标识符的第一次声明时,它指定该标识符具有extern链接属性,但是,如果它用于该标识符的第二次或以后的声明,不会更改由第一次声明所指定的链接属性
3.7 存储类型
变量类型 | 声明的位置 | 是否存于堆栈 | 作用域 | 如果声明为static |
全局 | 所有代码块之外 | 否 | 从声明处到文件尾 | 不允许从其他源文件访问 |
局部 | 代码块起始处 | 是 | 整个代码块 | 变量不存储于堆栈中,它的值在程序整个执行期一直保持 |
形式参数 | 函数头部 | 是 | 整个函数 | 不允许 |
3.12 编程提示的总结
1. 为了保持最佳的可移植性,把字符的值限制在有符号和无符号字符范围的交集之间,或者不要在字符上执行算术运算
2. 除了实体的具体的定义位置,在它的其它声明位置都使用extern