该系列笔记摘自《C Primer Plus》,人民邮电出版社,2005.2。
第1-3章阅读笔记
1、贝尔实验室的Dennis Ritchie在1972年开发了C。C来自Ken Thompson的B语言。这两位大师一起设计了UNIX操作系统。
2、C++向C语言嫁接了面向对象编程工具(面向对象编程是一种哲学思想,它试图让语言来适应问题,而不是让问题来适应语言)。
3、编译和链接:
编译器将源代码转换为目标代码文件,链接器将目标代码、系统的标准启动代码和库代码结合在一起生成可执行文件。
启动代码(start-up code)相当于程序与操作系统之间的接口,不同的操作系统使用不同的启动代码。
目标文件和可执行文件都是由机器语言指令组成的,但目标文件只包含您所编写的代码转换成的机器语言,而可执行代码还包含您所使用的库例程以及启动代码的机器代码。
4、#include <stdio.h>
该语句的作用相当于在文件中该行所在的位置键入了文件stdio.h的完整内容,实际上它是一种剪切和粘贴操作。
5、C语言的一个基本设计原则是避免不必要的成分。这个经济地使用资源的原则使得C语言在嵌入式编程中非常流行。
6、int main(void)
一个C程序总是从main()函数开始执行。int指明main()函数的返回类型是整数。返回到哪里呢?返回给操作系统。
7、C99标准允许一个标识符最多可以有63个字符,C90允许最多为31个字符。C语言的名字区分大小写。
8、提高程序可读性的几个技巧:
1. 选择有意义的变量名;
2. 使用注释;
3. 使用空行分隔一个函数的概念上的多个部分,如用空行分隔定义部分和动作部分;
4. 每行一个语句。
9、C的惯例是把main()函数放在文件开头,因为它通常为程序提供了最基本的框架。此外,C标准建议为要用的所有函数提供函数原型。
10、编译器的常见“错误”:
1.一个真正的语法错误可能导致编译器误认为它发现了其他错误。因此不用立刻改正所有发现的错误,而是修改前一个或前两个;
2.发现错误的位置比真正的错误要滞后一行。例如如果编译器指出某个具有分号的行少了一个分号,那么请检查上一行。
11、C语言关键字
ISO/ANSI C90标准包含34个关键字,C99标准在C90基础上新增了3个关键字。
12、变量与常量:
常量:数据可以在程序使用之前预先设定并在整个运行过程中没有变化;
变量:数据在程序运行过程中可能变化或被赋值。
变量与常量的区别在于变量的值可以在程序执行过程中变化与指定,而常量则不可以。
13、整数和浮点数在计算机中的存储方式不同。浮点数表示法将一个数分为小数部分和指数部分并分别存储。
C的各种整数类型的区别在于所提供数值的范围,以及数值是否可以取负值。
14、在使用printf()函数时,格式说明符的数目和要显示的参数值的数目一定要相同。大多数函数有确切的参数数目,编译器可以检查数目是否正确。然而,printf()函数可以有1个、2个、3个或更多的参数,这使得编译器无法使用常规的方法检查错误。
15、C语言仅保证short类型不会比int类型长,并且long类型不会比int类型短,这样做是为了适应不同的机器。
16、在int为32位的系统上,如果需要16位的值,那么使用short类型可以节省存储空间。通常,只有当程序使用了使系统可用内存很紧张的较大的整数数组时,节省存储空间才是重要的。使用short类型的另一个原因是计算机中的一些硬件寄存器是16位的。
17、C语言整数值达到最大值后如果继续加1,将会溢出到起始点。无符号类型变量的起始点是0,但C标准没有定义有符号类型的溢出规则,通常有符号类型整数的起始点是最小的负数值(其绝对值最大)。
18、请注意,尽管在C中常量后缀可以使用大写或小写字母,如L或l(小写的L)表示long类型,但格式说明符只能使用小写字母。
19、 关于printf()函数:
在使用printf()语句时,切记每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符相匹配。如果使用了不正确的说明符,会造成意想不到的后果。
printf()说明符决定数据的显示方式而不是决定数据的存储方式。
特别注意,使用%d显示float值不会把该float值转换为近似的int值,而是显示垃圾值。与之类似,使用%f显示int值也不会把该int值转换为浮动值。
printf()函数什么时候真正把输出传送给屏幕?首先,printf()语句将输出传递给一个被称为缓冲区(buffer)的中介存储区域。缓冲区中的内容再不断地被传递给屏幕。标准C规定在以下几种情况下将缓冲区内容传给屏幕:缓冲区满的时候、遇到换行符的时候以及需要输入的时候。
20、int类型被认为是计算机处理起来最方便有效的整数类型,所以在short类型和int类型长度不同的系统中,使用int类型值进行参数传递的速度更快。
21、char类型实际存储的是整数而不是字符。标准ASCII码值的范围从0到127,只需要7位即可表示,而char类型通常定义为使用8位内存单元(即8 bits)。
22、C把一个字节(byte)定义为char类型使用的位(bit)数。
23、C将字符常量视为int类型而非char类型。例如,在int类型为32位和char类型为8位的ASCII系统中,下列代码:
char grade = 'B';
意味着'B'作为数值66存储在一个32位单元中,而赋值后的grade则把66存储在一个8位单元中。
24、常用转义序列:
\n : 换行(将活动位置(如光标)移到下一行的开始处)
\r : 回车(将活动位置(如光标)移到当前行的开始处)
\\ : 反斜杠(\)
\xhh :十六进制值(h表示一个十六进制数字)
在给一个字符变量赋值时,转义序列必须用单引号括起来。然而,无论普通字符还是转义序列,如果作为双引号中字符集合的一部分,则无需单引号。
25、根据C90标准,C允许在关键字char前使用signed和unsigned。这样,无论默认的char是有符号类型还是无符号类型,signed char是有符号类型,而unsigned char则是无符号类型。这对于使用字符类型处理小整数十分有用。如果处理字符,则只须使用不带修饰词的标准char类型。
26、C标准规定,float类型必须至少能表示6位有效数字,取值范围至少为10-37到1037。double类型和float类型具有相同的最小取值范围要求,但它必须至少能表示10位有效数字。通常double类型至少具有13位有效数字,超出了C的最小标准规定。
27、默认情况下,编译器将浮点数常量当作double类型。可以通过f或F后缀使编译器把浮点常量当作float类型,或者使用L后缀使一个浮点数成为long double类型,没有后缀的浮点常量为double类型。
28、当为某个数值类型的变量进行初始化时,如果使用了其他类型的值,C会自动对该值进行类型转换以便和变量类型相匹配,这意味着可能会丢失一部分数据。
29、用双引号引起来的一串字符称为字符串。不论包含多少字符和标点符号,一个字符串只是一个参数。