C程序设计语言(K&R)清晰中文版

5星(超过95%的资源)
所需积分/C币:50 2013-08-25 22:43:45 970KB PDF
276
收藏 收藏
举报

C程序设计语言(K&R)清晰中文版 《C程序设计语言》是由C语言的设计者Dennis M. Ritchie和著名计算机科学家Brian W. Kernighan编写的一部介绍标准C语言及其程序设计方法的权威性经典著作。全面、系统地讲述了C语言的各个特性及程序设计的基本方法,包括基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口、标准库等内容。 《C程序设计语言》的讲述深入浅出,配合典型例证,通俗易懂,实用性强,适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。 在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用如此广泛。
不会换行。在 printf函数的参数中,只能用\n表示换行符。如果用程序的换行代替\n,例 printf(hello, world C编译器将会产生一条错误信息 printf函数永远不会自动换行,这样我们可以多次调用该函数以分阶段得到一个长的输 出行。上面给出的第一个程序也可以改写成下列形式: #inc⊥1de< stdio.h> main() printf(hello,)i printf(world")i printf("、n"); 这段程序与前面的程序的输出相同 请注意,\n只代表一个字符。类似于\n的转义字符序列为表示无法输入的字符或不可见 字符提供了一种通用的可扩充的机制。除此之外,C语言提供的转义字符序列还包括:\t表 示制表符;\b表示回退符;、"表示双引号:\\表示反斜杠符木身。2.3节将给出转义字符序 列的完整列表。 练习1-1在你自己的系统中运行"he11o,wox1d”稈序。再有意去掉程序中的部分 内容,看看会得到什么出错信息。 练习1-2做个实验,当 print函数的参数字符串中包含c(其中c是上面的转义 字符序列中未曾列出的某一个字符)时,观察一下会出现什么情况。 12.变量与算术表达式 我们来看下一个程序,使用公式℃=(5/9)(F-32打印下列华氏温度与摄氏温度对照表 17 2 80 26 100 37 120 48 140 60 160 71 180 82 200 9 220 1C4 240 115 260 126 280 137 300 148 此程序中仍然只包括一个名为main的函数定义。它比前面打印”he11o, world”的程序 长一些,但并不复杂。这个程序中引入了一些新的概念,包括注释、声明、变量、算术表达 式、循环以及格式化输出。该程序如下所示: #include <stdio.h> /*当三ahr=0,20, 300时,分别 打印华氏温度与摄氏温度对照表* maIn ⊥ nt fahr, celsius; int lower, upper, stepi ower /温度表的下限* upper =300 *温度表的上限* ste 20; /*步长x fa上r=1ower while (fahr < upper)i celsius=5 *(farr-32)/9 printf("8d\t器d、n",fahx, celsius); fahr fahr t step; 其中的两行 /*当fahr=0,20,….,300时,分别 打印华氏温度与摄氏温度对照表*/ 称为注释,此处,它简单地解释,该稈序是倣什么用的。包含在/*与x/之间的字符序列将被 编译器忽略。注释可以自由地运用在程序中,使得程序更易于理解。程序中允许出现空格 制表符或换行符之处,都可以使用注释。 在C语言中,所有变量都必须先声明后使用。声明通常放在函数起始处,在任何可执行 语句之前。声明用于说明变量的属性,它由一个类型名和一个变量表组成,例如: int fahr, celsius int lowcr, upper, stcpi 其中,类型int表示其后所列变量为整数,与之相对应的,f1at表示所列变量为浮点数(即 可以带有小数部分的数)。int与f1oat类型的取值范围取决于具体的机器。对于int类型, 通常为16位,其取值范围在-32768~32767之间,也有用32位表示的int类型。f1at类 刑通常是32位,它至少有6位有效数字,取值范围般在1038--1038之间。 除int与fla类型之外,C语高还提供了其它一些基木数据类型,例如: 字符 个字节 short 短整型 lone 长整型 double双精度浮点型 这些数据类型对象的人小也取决于具体的机器。另外,还存在这些基本数据类型的数组、结 构、联合,指向这些类型的指针以及返回这些类型值的函教。我们将在后续相应的章节中分 别介绍。 在上面的温度转换程序中,最开始执行的计算是下列4个赋值语句: Lower = o upper =3007 t 20 fahr = lower; 它们为变量设置初值。各条语句均以分号结束。 温度转換表中的各行计算方式相冋,因此可以用循环语句重复输出各行。这是 while循 坏语句的用途 while (fahr <= upper) while循环语伺的执行方式是这样的:首先测试圆括号中的条件;如果条件为真 (fanr<= upper),则执行循环体(括在花括号中的3条语句);然后再重新测试圆括号中的 条件,如果为真,则再次执行循坏体;当圆括号中的条件测试结果为假(fahr> upper)时, 循环结束,并继续执行跟在 while循环语句之后的下一冬语句。在本程序中,循环语句后没 有其它语句,因此整个程序的执行终止。 wile语句的循环体可以是用花括号括起米的一条或多条语句(如上面的温度转换程 序),也可以是不用花括号包括的单条语句,例如 while (i< 3) 在这两种情况下,我们总是把由 while控制的语句缩进一个制表位,这样就可以很容易地看 岀循环语句屮包含哪些语句。这种缩进方式突出了程序的逻辑结构。尽管C编译器并不关心 程序的外观形式,但正确的缩进以及保留适当空格的程序改讣风格对程序的易读性非常重婁。 我们建议每行只书写一条语句,并在运算符两边各加上一个空格字符,这样可以使得运算的 结合关系更清楚明了。相比而言,花括号的位置就不那么重要了。我们从比较流行的一些风 柊中选择了一种,读者可以选择适合自己的一种风格,并养成一直使用这种风格的好习惯。 在该稈序中,绝大部分工作都是在循环体中完成的。循环体中的赋值语句 celsius- 5 *(fahr -32)/9 用于计算与指定华氏温度相对应的摄氏温度值,并将结果赋佰给变量ce1sius。在该语句中, 之所以把表达式写成先乘5然后再除以9而不是直接写成5/9,其原因是在C语言及许多 其它语言中,整数除法操作将执行舍位,结果中的任何小数部分都会被舍弃。由于5和9都 是整数,5′9相除后经截取所得的结果为O,因此这样求得的所有摄氏温度都将为O。 从该例子中也可以看出 printf函数的一些功能。 printf是一个通用输出格式化函数, 第7章将对此做详绌介绍。该函数的第个参数是待打印的字符串,其中的每个百分号() 表示其它的参数(第二个、第三个、……参数)之一进行替换的位置,并指定打印格式。例 如,号d指定一个整型参数,因此语句 printf( od\tod\n", farr, celsius)i 用于打印两个整数fanr与 celsius的值,并在两者之间留一个制表符的空间(\t)。 printf函数的第一个参数中的各个号分别对应于第二个、第三个、…参数,它们在数 目和类型上都必须匹配,否则将出现错误的结果。 顺便指出, printf函数并不是C话言本身的一部分,C语言本身并没有定义输入/输出 功能。 printf仅仅是标准库函数中一个有用的函数而已,这些标准序函数在C语言程序中 通常都可以使用。但是,ANSI标准定义了 printf凶数的行为,因此,对每个符合该标准的 编译器和库来说,该函数的属性都是相同的。 为了将重点放到讲述C语言本身上,我们在第7章之前的各章中将不再对输入/输出做 更多的介绍,并且,特别将格式化输入推后到第7章讲解。如果读者想了解数据输入,可以 先阅读74节中对 scanf函数的讨论部分, scarf函数类似于 printf函数,但它用于读输 入数据而不是写输出数据。 上述的温度转换程序存在两个问题。比较简单的问题是,由于输出的数不是右对齐的, 所以输出的结果不是很美观。这个问题比较容易解决:如果在 printf语句的第一个参数的 d中指明打印宽度,则打印的数字会在打印区域内右对齐。例如,可以用语句 printf("3d 6d\r", ahr, celsius)i 打印fahr与ce1sis的值,这样,fahr的值占3个数字宽, celsius的值占6个数字宽, 输出的结果如下所示: 17 20 6 40 50 15 80 26 100 另一个较为严重的问题是,由于我们使用的是整型算术运算,因此经计算得到的摄氏温 度值伈太精确,例如,与O叩F对应的精确的摄氏温度应该为-17.8℃,而伈是-17℃C。为∫得到 更精确的结果,应该用浮点算术运算代替上面的整型算术运算。这就需要对稈序做适当修改。 下面是该程序的又一种版本 inc1ud< stdio,上> / print. Fahrenheit-Cel sius table for fahr -0, 2C,../ 300: floating-point version */ main float fahr, celsi float lowcr, upper, stcpi ⊥wer /x lower limit of temperatuire scale * upper =300: / upper limit * step -20 /* step s主ze* fahr lower; whilc (fahr ppcr Ce1sis=(5.0/9.0)x(fahr-32.0); printf("为3.Cf为6.1f fahr Isius) fahr ahr stepi 这个程序与前一个程序基本相同,不同的是,它把fahr与 celsius声明为 float类 型,转换公式的表述方式也更自然一些。在前一个程序中,之所以不能使用5/9的形式, 是因为按整型除法的计算规则,它们相除并舍位后得到的结果为0。但是,常数中的小数点表 明该常数是一个浮点数,因此,5.C′9.C是两个浮点数相除,结果将不被舍位。 如果某个算术运算符的所有操作数均为整型,则执行整型运算。但是,如果某个算术运 算符有一个浮氐型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮 点型。例如,在表达式£ahr-32中,32在运算过稈中将被自动转换为浮点数再参与运算。 不过,即使浮点常量取的是整型值,在书写时最好还是为它加上一个显式的小数点,这样可 以强调其浮点性质,便于阅读 第2章将详细介绍把整型数转换为浮点型效的规则。在这里需要注意,赋值语句 fahr - lower 与条件测试活伺 while (fahr < upper 乜都是按照这种方式执行的,即在运算之前先把int类型的操作数转换为 float类型的操作 数 printf屮的转换说明号3.0f表明待打印的浮点数(即fahr)至少占3个字符宽,且不 带小数点和小数部分;6.1三表明另一个待打印的数( celsius)至少占6个字符宽,且小 数点后面有1位数字。其输出如下所示: 20 6.7 格式说明可以省略宽度与精度,例如,6三表示待打印的浮点数至少有6个字符宽;号.2f 指定待打印的浮点数的小数点后有两位小数,但宽度没有限制;号则仅仅要求按照浮点数打 印该数。 是d 按照丨进制整型薮打印 6 按照十进制整型数打印,至少6个字符宽 是f 按照浮点数打印 86f 按照浮点数打印,至少6个字符宽 按照浮点数打印,小数点后有两位小数 6.2f 按照浮点数打印,至少6个字符宽,小数点后有两位小数 此外, printf函数还支持下列格式说明:。表示八进制数;8x表示十六进制数;8c 表示字符;号s表示字符串;表示百分号(号)本身。 练习1-3修改温度转换程序,使之能在转挨表的顶部打印一个标题。 练习1-4编写一个程序打印摄氏温度转换为相应华氏温度的转换表。 13.for语句 对」某个特定任务我们可以采用多种方法来编写程序。下面这段代码也叮以实现前面的 温度转换稈序的功能: #include <stdio.h> /*打印华氏温度摄氏温度对照表 main() int fahr; for (fahr =0 fahr <=300: fahr fahr +20) print("3d%6.1fn",fahr,(5.0/9.0)*(三ahr-32)); 这个程序与上节中介绍的程序执行结果相冋,但程序本身却有所不同。最主要的改进在于它 去掉了大部分变量,而只使用了一个int类型的变量fanr。在新引入的for语句中,温度 的下限、上限和步长都是常量,而计算摄氏温度的衣达式现在变成了 rint f函数的第一个 参数,它不再是一个单独的赋值语句。 以上几点改进中的最后一点是C语言中一个通用规则的实例:在允许使用某种类型变量 值的任何场合,都可以使用该类型的更复杂的表达式。因为 printf函数的第三个参数必须 是与:6.1f匹配的浮点值,所以可以在此处使用任何浮点表达式。 fo语句是一种循环语句,它是对 While语句的推广。如果将for语句与前面介绍的 while语句比较,就会发现for语句的操作更直观一些。圆括号中共包含3个部分,各部分 之闩用分号隔廾。第一部分 fahr =0 是初始化部分,仅在进入循环前执行一次。第二部分 fahr <=300 是控制循环的测试或条件部分。循环控制将对该条件求值,如果结果值为頁(rue),则执行 循环体(本例中的循环体仅包含一个 print函数调用话句)。此后将执行第三部分 fahr fahr 20 以将循环变量fahr增加一个步长,并再次对条件求值。如果计算得到的条件倌为假( falsc), 循环将终止执行。与 while语句一样,for循环语句的循环体可以只有一条语句,也可以是 用花括号括起来的一组语句。初始化部分(第一部分)、条件部分(第二部分)与增加步长部 分(第三部分)都可以是仟何表达式。 在实际编稈过稈中,可以选择whilε与£or中的仟意一种循环语句,主要要看使用哪 种更清晰。for语句比较适合初始化和增加步长都是单条语句并且逻辑相关的情形,因为它 将循环控制语句集中放在一起,且比wil语句更紧凑。 练习1-5修改温度转換程序,要求以逆序(即按照从300度到0度的顺序)打印温 度转换表。 14.符号常量 在结束讨论温度转换程序前,我们再来看下符号常量。在程序中使用30C、20等类似 的“幻数”并不是一个好习惯,它们几乎无法向以后阅读该程序的人提供什么信息,而且使 程序的修改变得更加困难。处理这种幻数的一种方法是赋予亡们有意义的名字。# define指 令可以把符号名(或称为符号常量)定义为一个特定的字符串 # define名字替换文本 在该定义之后,程序中出现的所有在# define中定义的名字(既没有用引号引起来,也个是 其它名字的一部分)都将用相应的替换文本替换。其中,名字与普通变量名的形式相同:它 们都是以宇母打头的字母和数字序列;替换文本可以是任何字符序列,而不仅限于数字。 #includc <stdio. h> # efine low回RC 大1ower1 imit of tab1ex defire UPPER 300 / upper limit * #defire STEP 20 / step size x/ /* print Fahrenhcit-Cclsius tablc * main() int fahr for (fahr lOWeR; fahr < UPPER; fahr = fahr STEP printf("3d6.1f\n",fahr,(5.0/9.0)*(=ahr-32)) 其中,工WER、 UPPER与STEP都是符号常量,而非变量,因此不需要出现在声明中。符号 常量名通常用大写字母拼写,这样可以很容易与用小写宇母拼写的变量名相区别。注意, # define指令行的末尾没有分号。 1.5.字符输入/输出 接下来我们看一组与字符型数据处理有关的程序。读者将会发现,许多程序只不过是这 里所讨论的程序原型的扩充版本而已。 标准库提供的输入/输岀模型非常简单。无论文木从何处输入,输出到何处,其输入 输出都是按照字符流的方式处理。文本流是由多行字符构成的字符序列,而每行字符则由0 个或多个宇符组成,行末是个换行符。标准库负责使每个输入/输出流都能够遵守这·模 型。使用标准厍的C语言程序员不必关心在程序之外这些行是如何表示的。 标准库提供了一次读/写一个字符的函数,其中最简单的是 getchar和 outchar两个 凶数。每次调用时, getchar函数从文本流中读入下一个输入字符,并将其作为结果值返回。 也就是说,在执行语句 c= getchar ( 之后,变量ε中将包含输入流中的下一个字符。这种字符通常是通过键盘输入的。关」从文 件输入字符的方法,我们将在第7章中讨论。 每次调用 putchar函数时将打印一个字符。例如,语句 putchar () 将把整型变量c的内容以字符的形式打印出来,通常是显示在屏幕上。 putchar与 printf 这两个函数可以交替调用,输出的次序与调用的次序致 1.51.文件复制 借助于 cathar与 putchar函数,可以在不了解其它输入/输出知识的情况下编写出 数量惊人的有用的代码。最简单的例了就是把输入·次个竽符地复制到输出,其基本思想 如下 读一个字符 Mie(该字符不是文件结束指示符) 输出刚读入的字符 读下一个字符 将上述基本思想转换为C语言程序为 # include< stdio,上> / copy input to output; Ist version main getchar( while (c!- ecF) f putchar(c) getchar(); 其中,关系运算符!=表示“不等于 字符在锭盘、屏幕或其它的任何地方无论以什么形式表现,它在机器內部都是以位模式 存储的。chax类型专门用于存储这种字符型数据,当然任何整型(int)也可以用于存储字 符犁数据。因为某些潜在的重要原因,我们在此使用int类型。 这里需要解决如何区分文件中有效数据与输入结束符的问题。C语言采取的解决方法是: 在没有输入时, getchar函数将返回一个特殊值,这个特殊值与仁何实际字符都不同。这个 值称为EOF( end of file,文件结束)。我们在声明变量的时候,必须让它大到足以存 放 getchar函数返回的仟何值。这里之所以不把c声明成char类型,是因为它必须足够人 除了能存储任何可能的字符外还要能存储文件结束符E○F。因此,我们将c声明成int类型 E○F定义在头文件< stdio.h>中,是个整型数,其具休数值是什么并不重要,只要它与 仟何char类型的值都不相同即可。这里使用符号常量,可以确保程序不需要依赖于其对应的 冮何特定的数值。 对于经验比较丰富的C语言程序员,可以把这个字符复制程序编写得更精炼一些。在C 语言中,类似于 c- getchar( 之类的赋值操作是一个表达式,并且只有一个值,即赋值后左边变量休存的值。也就是说, 赋值可以作为更大的表达式的一部分出现。如果将为c赋值的操作放在whie循环语句的测 试部分中,上述字符复制程序便可以改写成下列形式: #inc1ude<tdio.上>

...展开详情
试读 127P C程序设计语言(K&R)清晰中文版
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
勤奋的小游侠 经典的HOLLO world例子,很能说明问题,是学习C语言的必备书
2017-07-25
回复
wzr_8703 经典书籍!很清楚!
2015-06-10
回复
dawnqovd 很清晰,很好,值得拥有
2014-11-24
回复
s3823056 经典书籍,必须推荐, 分太高了!
2014-10-24
回复
darknightxx 经典的书籍,值得好好研究,资源也不错。
2014-08-28
回复
lp1900 文字版 比扫描的强
2014-08-21
回复
疯狂世界的咸鱼 的确很清晰,和第二版中文扫描稿对比了一下,不一样,不知道是第几版的,可惜的是没有目录封面之类的。。。不过也不错,至少内容很清晰。
2014-08-02
回复
ufozhou88 经典的HOLLO world例子,很能说明问题,是学习C语言的必备书
2014-06-26
回复
kanny_ren 不是扫描版的,很清晰
2014-04-17
回复
小野狼fight C作者写的书,太强大了~~
2014-03-12
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
C程序设计语言(K&R)清晰中文版 50积分/C币 立即下载
1/127
C程序设计语言(K&R)清晰中文版第1页
C程序设计语言(K&R)清晰中文版第2页
C程序设计语言(K&R)清晰中文版第3页
C程序设计语言(K&R)清晰中文版第4页
C程序设计语言(K&R)清晰中文版第5页
C程序设计语言(K&R)清晰中文版第6页
C程序设计语言(K&R)清晰中文版第7页
C程序设计语言(K&R)清晰中文版第8页
C程序设计语言(K&R)清晰中文版第9页
C程序设计语言(K&R)清晰中文版第10页
C程序设计语言(K&R)清晰中文版第11页
C程序设计语言(K&R)清晰中文版第12页
C程序设计语言(K&R)清晰中文版第13页
C程序设计语言(K&R)清晰中文版第14页
C程序设计语言(K&R)清晰中文版第15页
C程序设计语言(K&R)清晰中文版第16页
C程序设计语言(K&R)清晰中文版第17页
C程序设计语言(K&R)清晰中文版第18页
C程序设计语言(K&R)清晰中文版第19页
C程序设计语言(K&R)清晰中文版第20页

试读结束, 可继续阅读

50积分/C币 立即下载 >