C程序设计语言(Kernghan & Ritchie 版,徐宝文、李志翻译)

所需积分/C币:18 2012-09-06 15:52:56 1.02MB PDF

现在最好的 C 语言书籍,Kernghan & Ritchie 版,徐宝文、李志翻译,并且无水印非影印版,最适合阅读的 C 语言圣经!
不会换行。在 函数的参数中,只能用表示换行符。如果用程序的换行代替,例 编译器将会产生一条错误信息。 函数永远不会自动换行,这样我们可以多次调用该函数以分阶段得到一个长的输 出行。上面给出的第一个程序也可以改与成下列形式: 这段程序与前面的程序的输出相同 请注意,只代表一个字符。类似于的转义字符序列为表示无法输入的字符或不可见 字符提供了一种通用的可扩充的机制。除此之外,语言提供的转义字符序列还包括:表 示制表符;表示回退符;表示双引号;表示反斜杠符木身。节将给出转义字符序 列的完整列表 练习 在你自己的系统中运行 程序。再有意去掉程序中的部分 内容,看看会得到什么出错信息 练习 散个实验,当 函数的参数字符串中包含(其中是上面的转义 字符序列中未曾列出的某一个字符)时,观察一下会出现什么情况。 变量与算术表达式 我们来看下一个程序,使用公式℃"F打印下列华氏温度与摄氏温度对照表 此程序中仍然只包括一个名为 的函数定义。它比前面打印 的程序 长一些,但并不复杂。这个程序中引入了一些新的概念,包括注释、声明、变量、算术表达 式、循环以及格式化输出。该程序如下所示 时,分别 打印华氏温度与摄氏温度对照表 温度表的下限 温度表的上限 步长 其中的两行 打印华氏温度与摄民温度对照长物 当 时 称为注释,此处,它简单地解释,该程序是倣什么用的。包含在与之间的字符序列将被 编译器忽略。注释可以自由地运用在程序中,使得程序更易于理解。程序中允许岀现空格 制表符或换行符之处,都可以使用注释。 在语言中,所有变量都必须先声明后使用。声明通常放在函数起始处,在任何可执行 语句之前。声明用于说明变量的属性,它由一个类型名和一个变量表组成,例如 其中,类型表示其后所列变量为整数,与之相对应的 表示所列变量为浮点数(即, 可以带有小数部分的数) 类型的取值范围取决于只体的机器。对于类型, 通常为位,其取值范围在 之间,也有用位表示的类型。 类 型通常是位,它至少有位有效数字,取值范围般在 之间 除与 类型之外,语高还提供了其它一些基木数据类型,例如 字符个字节 短整型 长整型 双精度浮点型 这些数据类型对象的人小也取决于具体的机器。另外,还存在这些基本数据类型的数组、结 构、联合,指向这些类型的指针以及返回这些类型值的函教。我们将在后续相应的章节中分 别介绍。 在上面的温度转换程序中,最开始执行的计算是下列个赋值语句: 它们为变量设置初值。各条语句均以分号结束。 温度转换表中的各行计算方式相同,因此可以用循环语句重复输出各行。这是 循 坏语句的用途: 循环语句的执行方式是这样的:首先测试圆括号中的条件;如果条件为真 则执行循环体(括在花括号中的条语句);然后再重新测试圆括号中的 条件,如果为真,则再次执行循坏体;当圆括号中的条件测试结果为假 循环结束,并继续执行跟在 循环语句之后的下一条语句。在本程序中,循环语句后没 有其它语句,因此整个程序的执行终止 语句的循环体可以是用化括号括起米的一条或多条语句(如上面的温度转换程 序),也可以是不用花括号包括的单条语句,例如 在这两种情况下,我们总是把由 控制的话句缩进一个制表位,这样就可以很容易地看 岀循环语句中包含哪些语句。这种缩进方式突出了程序的逻辑结构。尽管编译器并不关心 程序的外观形式,但正确的缩进以及保留适当空格的程序改计风格对程序的易读性非常重要。 我们建议每行只书写一条语句,并在运算符两边各加上一个空格字符,这样可以使得运算的 结合关系更清楚明了。相比而言,花括号的位置就不那么重要了。我们从比较流行的一些风 柊中选择了一种,读者可以选择适合自己的一种风格,并养成一直使用这种风格的好习惯。 在该稈序中,绝人部分工作都是在循环体中完成的。循环体中的赋值语句 用于计算与指定华氏温度相对应的摄氏温度值,并将结果赋佰给变量 。在该语句中 之所以把表达式写成先乘然后再除以而不是直接写成 其原因是在语言及许多 其它语言中,整数除法操作将执行合位,结果中的任何小数部分都会被舍弃。由于和都 是整数, 相除后经截取所得的结果为,因此这样求得的所有摄氏温度都将为 从该例子中也可以看出 函数的一些功能 是一个通用输出格式化函数, 第章将对此做详细介绍。该函数的第个参数是待打印的字符串,其中的每个百分号() 表示其它的参数(第二个、第三个、参数)之一进行替换的位置,并指定打印格式。例 如,指定一个整型参数,因此语句 用于打印两个整数 的值,并在两者之间留一个制表符的空间()。 函数的第一个参数中的各个分别对应于第二个、第三个、参数,它们在数 目和类型上都必须匹配,否则将出现错误的结果。 顺便指出, 函数并不是语言本身的一部分,语言本身并没有定义输入/输出 功能。 仅仅是标准库函数中一个有用的函数而已,这些标准厅函数在语言程序中 通常都可以使用。但是,标准定义了 凶数的行为,因此,对每个符合该标准的 编译器和库来说,该函数的属性都是相冋的。 为了将重点放到讲述语言夲身上,我们在第章之前的各章中将不再对输入/输出做 更多的介绍,并且,特别将格式化输入推后到第章讲解。如果读者想了解嶔据输入,可以 先阅读节中对 函数的讨论部分, 函数类似于 函数,但它用于读输 入数据而不是写输出数据。 上述的温度转换程序存在两个问题。比较简单的问题是,由于输出的数不是右对齐的, 所以输出的结果不是很美观。这个问趣比较容易解决:如果在 语句的第一个参数的 中指明打印宽度,则打印的数字会在打印区域内右对齐。例如,可以用语句 打印 的值,这样, 的值凸个数字宽 的值占个数字宽 输出的结果如下所示: 弓一个较为严重的问题是,由于我们使用的是整型算术运算,因此经计算得到的摄氏温 度值不太精确,例如,与℃对应的精确的摄氏温度应该为℃,而不是℃C。为∫得到 更精确的结果,应该用浮点算术运算代替上面的整型算术运算。这就需要对稈序做适当修改。 下面是该程序的又一种版本 这个程序与前一个程厅基本相同,不同的是,它把与 声明为 类 型,转换公式的表述方式也更自然一些。在前一个程序中,之所以不能使用 的形式, 是因为按整型除法的计算规则,它们相除并舍位后得到的结果为。但是,常数中的小数点表 明该常数是一个浮点数,因此 是两个浮点数相除,结果将不被舍位。 如果某个算术运算符的所冇操作数均为整型,则执行整型运算。但是,如果某个算术运 算符有一个浮点型操作薮和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮 点型。例如,在表达式 ,在运算过稈中将被自动转换为浮点数再参与运算。 不过,即使浮点常量取的是整型值,在书写时最好还是为它加上一个显式的小数点,这样可 以强调其浮点性质,便于阅读。 第章将详细介绍把整型数转换为浮点型数的规则。在这里需要注意,赋值语句 与条件测试语句 也都是按照这种方式执行的,即在运算之前先把类型的操作数转换为 类型的操作 数 中的转换说明 表明待打印的浮点数(即)至少占个字符宽,且不 带小数点和小数音分; 表明另一个待打印的数( )至少占个字符宽,且小 数点后面有位数字。其输出如下所示 格式说明可以省略宽度与精度,例如,衣示待打印的浮点数至少有个字符宽 指定待打印的浮点数的小薮点后有两位小数,但宽度没有限制;则仅仅要求按照浮点数打 印该数。 按照|进制整型数打印 按照十进制整型数打印,至少个字符宽 按照浮点数打印 按照浮点数打印,至少个字符宽 按照浮点数打印,小数点后有两位小数 按照浮点数打印,至少个字符宽,小数点后有两位小数 此外, 睬数还支持下列格式说明:表示八进制数;表示十六进制数 表示字符;表示字符串;表示百分号()本身。 练习 修改温度转换程序,使之能在转换表的顶音打印一个标题 练习 编写一个程序打印摄氏温度转换为相应华氏温度的转换表。 语句 对」某个特定任务我们可以呆用多种方法来编写程序。下面这段代码也可以实现前面的 温度转换稈序的功能: 打印华氏温度摄氏温度对照表 这个程序与上节中介绍的程序执行结果相同,但程序本身却有所不同。最主要的改进在于它 去掉了大部分变量,而只使用了一个类型的变量在新引入的语句中,温度 的下限、上限和步长都是常量,而计算摄氏温度的衣达式现在变成了 函数的第三个 参数,它不再是一个单独的赋值语句。 上几点改进中的最后一点是语言中一个通用规则的实例:在允许使用某种类型变量 值的任何场合,都可以使用该类型的更复杂的表达式。因为 函数的第三个参数必须 是与 匹配的浮点值,所以可以在此处使用任何浮点表达式 语伺是一种循环语句,它是对 语句的推广。如果将语句与前面介绍的 语句比较,就会发现语句的操作更直观一些。圆括号中共包含个部分,各部分 之闩用分号隔廾。第一部分 是初始化部分,仅在进入循坯前执行一次。第二部分 是控制循环的测试或条件部分。循环控制将对该条件求值,如果结果值为貞(),则执行 循环体(本例中的循环体仅包含一个 函数调用话句)。此后将执行第三部分 以将循环变量 增加一个步长,并次对条件求值。如果计算得到的条件值为假( 循环将终止扶行。与 语句一样,循环语句的循环体可以只有一条语句,也可以是 用花括号括起来的一组语句。初始化部分(第一部分)、条件部分(第二部分)与增加步长部 分(第三部分)都可以是仟何表达式。 在实际编程过程中,可以选择 与中的仟意一种循环语句,主要要看使用哪一 种更清 语句比较适合初始化和增加步长都是单条语句并且逻辑相关的情形,因为它 将循环控制话句集中放在一起,且比 语句更紧凑。 练习 修改温度转换程序,要求以逆序(即按照从度到度的顺序)打印温 度转换表。 符号常量 在结束讨论温度转换程序前,我们再来看下符号常量。在程序中使用 等类似 的“幻数”并不是一个好习惯,它们几乎无法向以后阅读该程序的人提供什么信息,而且使 程序的修改变得更加困难。处理这种幻数的一种方法是赋予它们有意义的名字。 指 令可以把符号名(或称为符号常量)定义为一个特定的字符串 名字替换文本 在该定义之后,程序中出现的所有在 中定义的名字(既没有用引号引起来,也不是 其它名字的一部分)都将用相应的替换文本替换。其中,名字与普通变量名的形式相同:它 们都是以字母打头的字丹和数字序列;替换文本可以是任何字符序列,而不仪限于数字 其中, 与 都是符号常量,而非变量,因此不需要出现在声明中。符号 常量名通常用大写字拼写,这样可以很容易与用小写字母拼写的变量名相区别。注意 指令行的末尾没有分号。 字符输入/输出 接下来我们看一组与字符型数据处理有关的程序。读者将会发现,许多程序只不过是这 里所讨论的程序原型的扩充版本而已 标准库提供的输入/输出模型非常简单。无论文木从何处输入,输出到何处,其输入 输出都是按照字符流的方式处理。文木流是由多行字符构成的字符序列,而每行字符则由 个或多个宇符组成,行末是·个换行符。标准库负责使每个输入/输出流都能够遵守这模 刑。使用标准库的语言程序员不必关心在程序之外这些行是如何表示的。 标准库提供了一次读/写一个字符的函数,其中最简单的是 和 两个 区数。每次调用时, 函数从文本流中读入下一个输入字符,并将其作为结果值返 也就是说,在执行语句 之后,变量中将包含输入流中的下一个字符。这种字符通常是通过键盘输入的。关」从文 件输入字符的方法,我们将在第章中讨论。 每次调用 函数时将打印一个字符。例如,语句 将把整型变量的内容以字符的形式打印出来,通常是显示在屏幕上。 与 这两个函数可以交替调用,输出的次序与调用的次序·致 文件复制 佶助于 与 函数,可以在不了解其它输入/输出知识的情況下编写出 数量惊人的有用的代码。最简单的例了就是把输入·次个宇符地复制到输出,其基本思想 如下: 读一个字符 该字符不是文件结束指示符 输出刚读入的字符 读下一个字符 将上述基本思想转换为语言程序为 其中,关系运算符表示“不等于” 字符在键盘、屏幕或其它的任何地方无论以什么形式表现,它在机器内部都是以位模式 存储的。类型专门用于存储这种字符型数据,当然任何整型()也可以用于存储字 符犁数据。因为某些潜在的重要原因,我们在此使用类型。 这里需要解决如何区分文件中有效数据与输入结束符的问题。语言采取的解决方法是: 在没有输入时 函数将返回一个特殊值,这个特殊值与仁何实际字符都不同。这个 值称为 ,文件结束)。我们在声明变量的时候,必须让它大到足以存 放 函数返回的仟何值。这里之所以不把声明成类型,是因为它必须足够人, 除了能存储任何可能的字符外还要能存储文件结束符。因此,我们将声明成类型 定义在头文件 中,是个整型数,其具体数值是什么并不重要,只要它与 仟何 类型的值都不相同即可。这里使用符号常量,可以确保稈序不需要依赖于其对应的 任何特定的数值 对于经验比较丰富的语言程序员,可以把这个字符复制程序编写得更精炼一些。在 语言中,类似于 之类的赋值操作是一个表达式,并且只有一个值,即赋值后左边变量保存的值。也就是说, 赋值可以作为更大的表达式的一部分出现。如果将为赋值的操作放在 循环语句的测 试部分中,上述字符复制程序便可以改写成下列形式:

...展开详情
img

关注 私信 TA的资源

上传资源赚积分,得勋章
相关内容推荐