第8章 字符输入/输出和输入确认
1、输入输出缓冲分为两类:完全缓冲I/O和行缓冲I/O。对完全缓冲输入来说,缓冲区满时被清空(内容被发送至目的地)。这类缓冲通常出现在文件输入中,缓冲区的大小取决于系统。对行缓冲I/O来说,遇到一个换行字符时将被清空缓冲区。键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。
2、在多数UNIX系统上,在一行的开始键入Ctrl+D会导致传送文件尾信号。许多微型计算系统将一行的开始位置键入的Ctrl+Z识别为文件尾信号,还有一些则把任意位置的Ctrl+Z解释成文件尾信号。
3、UNIX、Linux和DOS都支持重定向输入和输出。输入重定向使您的程序能够使用文件代替键盘作为输入,输出重定向则使程序能够使用文件代替屏幕作为输出。
4、UNIX、Linux和DOS下使用两个重定向运算符<(输入)和>(输出)所遵循的规则:
<1>重定向运算符将一个可执行程序(包括标准的操作系统命令)与一个数据文件连接起来,该运算符不能用于一个数据文件与另一个数据文件的连接,也不能用于一个程序与另一个程序的连接。
<2>使用这些运算符时,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件。
5、重定向输入和输出的方法:
下面令prog为可执行程序的名字,并令file1和file2为文件名,
<1>将输出重定向到一个文件:prog > file1
<2>将输入重定向为来自一个文件:prog < file2
<3>组合重定向:
prog < file2 > file1
prog > file1 < file2
这两种形式都使用file2作为输入,使用file1作为输出。
6、通常,系统使用行缓冲输入(line-buffered input),这意味着输入的内容在您按下回车键时被传输给程序。按下回车键的同时还将传输给一个编程时需要注意的换行字符。
如果混合使用scanf()和getchar(),那么当调用getchar()之前scanf()恰好在输入中留下一个换行符时,将会产生问题。如果知道这个问题,就可以在编程中解决它。

第9章 函数
1、形式参量
也称形式参数。如同函数内部定义的变量一样,形式参量是局部变量,它们是函数所私有的。
2、在原型声明中使用的变量名并没有实际地创建变量,此处的变量名也可以省略,而只保留其数据类型。
3、当函数返回值的类型和声明的类型不相同时,实际返回值是当把指定要返回的值赋给一个具有所声明的返回类型的变量时得到的数值。
4、无返回值的函数应该被声明为void类型。在早期版本的C语言中,如果函数没有进行类型声明,则该函数具有默认的函数类型int。使用这种默认类型的原因是早期大多数C语言函数都是int类型的。但是C99标准不再支持函数的int类型的默认设置。
5、C允许一个函数调用其本身,这种调用过程被称作递归(recursion)。关于递归使用的几个基本要点:
<1>每一级的函数调用都有自己的变量。
<2>每一次函数调用都会有一次返回。
<3>递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序;位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。
<4>虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。函数代码是一系列的计算机指令,函数调用就是从头执行这个指令集的一条命令。一个递归调用会使程序从头执行相应函数的指令集。
<5>递归函数中必须包含可以终止递归调用的语句。
6、最简单的递归形式是把递归调用语句放在函数结尾即恰在return语句之前。这种形式被称为尾递归(tail recursion)或结尾递归(end recursion)。
7、如果循环和递归都可以用来实现某函数功能,一般来讲选择循环更好一些。首先,因为每次递归调用都拥有自己的变量集合,所以就需要占用较多的内存;每次递归调用需要把新的变量集合存储在堆栈中。其次,由于进行每次函数调用需要花费一定的时间,所以递归的执行速度较慢。
8、把函数原型和常量定义放在一个头文件中是一个很好的编程习惯。
9、一般地,当需要改变调用函数中的某个参数值时,任何被调用的无返回值的C函数都需要使用地址参数来完成该任务。
10、*和指针名之间的空格是可选的。通常程序员在声明中使用空格,而在指向变量时将其省略。