第1章-导言-知识点

  第1章是导言部分,内容相对简单,可以快速阅读一遍,并适当做一些练习,等学完后面章节再回头做剩余的练习。下面将简单记录几个重要的知识点:

1.1-1.3

(1)【P2】C语言程序都是由函数和变量组成的,函数中包含一些语句statement,用以执行一些操作;变量则是用于存储操作过程中需要使用的值;

(2)【P5】提到了程序的规范性写法,需要注意的是

①Tab对应的是四个空格(而不是我以为的三个);

②操作符两边加空格与操作数隔离开来(我一直不加空格);

(3)【P6】printf的格式化输出用法可详见P135,这里知道%6.1f是按照浮点数打印,至少6个字符宽,小数点后面有1位小数就可以;

 

1.4-1.5

(1)【P9】一般在程序内部中不直接使用300、20等数字,因为会导致阅读困难,另外一个阅读者可能并不理解数字的含义,可以通过#define宏定义来声明,这样也方便修改。注意宏定义时的变量需要大写,并且不带分号。

(2)【P9】这里了解一下文本模型:文本流是由多行字符构成的字符序列,而每行字符则由0个或多个字符组成,行末是一个换行符,标准库负责使每个输入/输出流都遵守这一模型。

字符在机器内部是以位模式存储的,一般用char类型,但是为了存放文件结束符EOF,一般将接受字符的变量声明为int类型。下面简单说明一下EOF:

EOF是end of file的缩写,表示"文字流"(stream)的结尾,它不是特殊字符,而是一个定义在头文件stdio.h的常量,#define EOF (-1),一般等于-1。以EOF作为文件结束标志的文件,必须是文本文件,由于数据在文本中都是以字符的ASCII代码值(范围是0~127)的形式存放,不可能出现-1,因此可以用EOF作为文件结束标志。

注意这里所说的"文字流",可以是文件(file),也可以是标准输入(stdin)。标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。在windows系统中,按下Ctrl+Z和回车键来模拟EOF条件,UNIX和Linux用户应按Ctrl+D来模拟。

EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+Z都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。

①遇到getchar函数执行时,要输入第一个字符时就直接输入Ctrl+Z,就可以跳出getchar(),去执行程序的其他部分;

②在前面输入的字符为换行符时,接着输入Ctrl+Z;

③在前面有字符输入且不为换行符时,要连着输入两次Ctrl+Z,这时第二次输入的Ctrl+Z起到文件结束符的功能。

(3)【P12】若是int类型范围太小的话,可以使用long类型(最少是32位,由机器本身决定,有时会和int大小相同,若使用printf的话需要修改转换说明为%ld),也可以使用更大的double;

(4)【P13】注意字符常量(用单引号)与字符串常量(用双引号)的区别。字符常量的值等于该字符在机器字符集中对应的数值,在表达式中只是一个整型数(跟所选用的机器字符集有关,不要以为只有ASCII字符集);

(5)【P14】1.5.4节的例程感觉相当精彩,亮点是使用state来判断读出的字符是否在单词里面,开始初始化state为OUT,然后c=getchar()读入一个字符,不是空格/制表符/换行符之类字符的话就执行else if(state==OUT)将state设置为IN,一直到下一个空格/制表符/换行符(说明该单词结束)为止;

还要注意nl=nw=nc=0;赋值语句是从右到左执行的,而if(c==’ ’||c==’\n’||c==’\t’)是从左到右,只要有一个条件满足就不会执行后面的语句判断。

 

1.6-1.9

(1)【P15】用数组的形式来统计数字发生的次数,这种做法比较巧妙。

Int ndigit[10];

...

If(c>=’0’&&c<=’9’)

    ++ndigit[c-’0’];

(2)【P18】函数定义的一般形式是

返回值类型 函数名(0个或多个参数声明)

{

  声明部分

  语句部分

}

函数定义可以以任意次序从现在一个源文件或多个源文件中,但同一函数不能分割存放在多个文件中。函数定义中圆括号内出现的变量称为形式参数,而函数调用中与形式参数对应的值称为实际参数

(3)传递给被调用函数的参数值存放在临时变量中,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。通过提供待设置变量的地址(指向变量的指针)来修改主调函数的变量,这种情况下被调用函数对应的参数声明应该为指针

(4)【P22】getline函数预期作用是在读入文本行时返回该行的长度,遇到文件结束符时返回0(0不是有效的行长度,可作为标志文件结束的返回值)。每一行至少包括一个字符,只包含换行符的行长度为1。

调用getline函数的程序无法预先知道输入行的长度,getline函数需要检查是否溢出(应该是for()里面的i<lim-1这一句);调用copy函数的程序知道字符串的长度,无需进行错误检查(因为前面的getline已经检查了是否溢出,这里的copy只需要检测是否到达字符串结尾\0即可)。

(5)【P23】外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元。在每个需要访问外部变量的函数中,必须声明相应的外部变量(此时说明其类型),声明时可以用extern语句显示声明,也可以通过上下文隐式声明。

在单个源文件中,如果外部变量的定义出现在使用它的函数之前,该函数可不必使用extern声明,通常是把所有外部变量的定义放在源文件开始之处,这样可以省略extern声明;若是多个源文件的话,一般做法是把变量和函数的extern声明放在一个单独的头文件.h里面,每个源文件开头使用#include包含进来。

需要区分定义(define)和声明(declaration),定义表示创建变量或分配存储单元,而声明指的是说明变量的性质,但并不存储单元。

 

posted @ 2016-07-30 11:44  cust渔舟唱晚  阅读(205)  评论(0编辑  收藏  举报