第三章 数据
1、听上去“长整型”所能表示的值应该比“短整型”所能表示的值要大,但这个假设并不一定成立。
长整型至少应该和整形一样长,而整型至少应该和短整型一样长。
标准没有规定长整型必须比短整型长,只是规定它不得比短整型短。
2、字符在本质上是小整型值。
3、只有当程序所使用的char型变量的值位于signed char 和 unsigned char的交集中,这个程序才是可以移植的。
4、整型家族9种不同类型:
char
unsigned char
signed char
short
unsigned short
int
unsigned int
long
unsigned long
5、枚举类型
enum Jar_Type {CUP,PINT,QUART,HALF_GALLON,GALLON};
enum Jar_Type milk_jug,gas_can,medicine_bottle;
<=>
enum {CUP,PINT,QUART,HALF_GALLON,GALLON}
Jar_Type milk_jug,gas_can,medicine_bottle ;
符号名可以指定特定的整型值:
enum Jar_Type {CUP=8,PINT=16,QUART=32,HALF_GALLON=64,GALLON=128};
如果某个符号未显示指定一个值,那么它的值就比前面一个符号名的值大1.
6、规定:所有的浮点类型至少能容纳-10^37~ 10^37之间的任何值。
7、字符串常量(不像字符常量)可以是空的。
8、C数组一个值得关注的地方:编译器并不检查程序对数组下标的引用是否在数组的合法范围内。
9、我自己很不习惯下面的一种格式:
typedef char * ptr_to_char;
ptr_to_char a;
10、int const a;
const int a;
没什么区别吧?
11、 int *pi; //pi是一个普通的指向整型的指针
int const *pi; //pi是指向整型常量的指针:你可以修改指针的值,但是你不能修改它所指向的值。
int * const pi; //pi是指向整型的常量指针:此时指针是常量,它的值无法修改,但是可以修改它所指向的整型的值。
int const * const pi; //无论是指针本身还是它所指向的值都是常量,不允许修改。
12、两个非嵌套的代码块:
由于两个代码块的变量不可能同时存在,所以编译器可以把它们存储与同一个内存地址。在任何时刻,两个非嵌套的代码块最多只有一
个处于活动状态。
13、函数名本身并不属于任何代码块。
14、连接属性:
none:总是被当做单独的个体。
internal:标识符在同一个源文件内的所有声明中都指同一个实体,但是位于不同源文件的多个声明则分属不同的实体。
external:标识符不论声明多少次,位于几个源文件都表示同一个实体。
15、作用域、连接属性和存储类型总结
变量类型 声明的位置 是否存储于堆栈 作用域 如果声明为static
全局 所有代码 否 从声明处到文件尾 不允许从其他源文件访问
局部 代码块起始处 是 整个代码块 变量不存储于堆栈中,它的值在程序整个执行期一直保持
形参 函数头部 是 整个函数 不允许
16、在计算机中,如果把指针声明为寄存器变量,程序的效率能得到提高,尤其是那些频繁执行间接访问操作的指针。
第四章 语句
1、像这样的语句是合法的:
y+3;
getchar();
2、printf函数返回它实际打印的字符数。
3、C并不具备布尔类型,而是用整型来代替。
4、else自己从属于离它最近的不完整的if语句。
5、单独用一行来表示空语句是比较好的做法。
6、for语句和while语句执行过程中的区别在于出现continue语句时:
在for语句中,continue语句跳过循环体的剩余部分,直接回到调整部分。
在while语句中,调整部分是循环体的一部分,所以continue将会把它也跳过。
7、switch(expression)
statement
expression 的结果必须是整型值。
8、每个switch语句中只能出现一条default字句。但是,它可以出现在语句列表的任何位置,而且语句会想贯穿一个case标签一样贯穿 default字句。
9、由于break语句只影响包围它的最内层的循环,要想立即从深层嵌套的循环中退出的办法:
1)、使用goto语句
2)、设置一个状态标识,在每个循环中都必须进行测试:
3)、可以使用return语句离开这个函数。
10、库函数属于编译器?