C Primer Plus(第五版)1

筅森魡賤 提交于 2020-02-28 03:44:48

这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等。

1.1 C语言的起源

贝尔实验室的 Dennis Ritchie 在1972年开发了C,当时他正在与Ken Thompson 一起设计 UNIX操作系统 。

 

1.4 计算机工作的基本原理

现代计算机可分为几个部件。中央处理单元(或称CPU)担负着绝大部分的计算工作,随机访问存储器(或称RAM)作为一个工作区来保存程序和文件;永久存储器,一般是硬盘,即使在计算机关机时也能记下程序和文件;还有各种外围设备(如键盘,鼠标和监视器)用来提供人与计算机之间的通信。CPU负责处理程序,所以我们集中来讨论它的功能。

CPU 的工作非常简单,至少在我们所做的这一简短的描述中是这样的。它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令并执行,。一个千兆 CPU 可以在一秒种内进行大约一亿次这样的操作,所以 CPU 能以惊人的速度来从事其枯燥的工作。CPU 有自己的小工作区,该工作区由若干个寄存器(registers)组成,每个寄存器可以保存一个数。一个寄存器保存下一条指令的内存地址,CPU 使用该信息获取下一条指令。获取一条指令后,CPU 在另一个寄存器中保存该指令并将第一个寄存器的值更新为下一条指令的地址。CPU 只能理解有限的指令(指令集)。还有,这些指令是相当具体的,其中许多指令要求计算机将一个数从一个位置移动到另一个位置,例如,从内存单元移到寄存器。

明白了计算机运行方式的一个结果就是:如果你希望计算机做某件事,就必须提供一个特定的指令列表(一套程序)确切地告诉计算机要做的事及如何去做。你必须以一种计算机可以直接理解的语言(机器语言)来创建该程序。这是一项繁琐,乏味,费力的任务。即使将两个想回这样简单的事也必须被分解成若干个步骤:

1 将内存单元为2000中的数字复制到寄存器1.
2 将内存单元为2004中的数字复制到寄存器2.
3 将寄存器2的内容加到寄存器1的内容,答案保留在寄存器1中。
4 将寄存器1的内容复制到内存单元2008.

1.6 使用 C 语言的7个步骤

1。定义程序目标
2. 设计程序
3. 编写代码
4. 编译
5. 运行程序
6. 测试和调试程序
7. 维护和修改程序

1.6.3 第3步: 编写代码

一般来说,需要使用文本编辑器来创建一种称为源代码的文件,该文件包含你的程序设计的的 C 实现形式。程序清单1.1 显示了 C 源代码的一个例子。

程序清单1.1 C源代码的例子
-----------------------------------------------------
#include<stdio.h>
int main(void)
{
int dogs;

printf ("How many dogs do have?\n");
scanf ("%d",&dogs);
printf("So you nave %d dog(s)!\n", dogs);
return 0;
}

作为这一步的一部分,你应该给所编写的程序添加文字注释。最简单的方式是使用 C 的注释工具向源代码中加入解释。 第2章“C语言概述”会更详细地解释有关在代码中添加注释方面的内容。


1.6.4 第4步:编译

编译器是一个程序,其工作是将源代码转换为可执行代码。可执行代码是用计算机的本机语言或机器语言表示的代码。这种语言是由数字代码表示的详细指令组成。正如前面所介绍的,不同计算机具有不同的机器语言,C 编译器用来将 C 语言转换成特定的机器语言。C 编译器还从 C 的库中向最终程序加入代码。库中包括着许多标准例程供你使用,例如 printf()和

scanf().(更准确地说,是一个被称为链接器(linker)的程序将库例程引入的,但在多数系统上,编译器为你运行链接器)。最后的结果是,形成一个包含计算机可以理解的代码并且你能够运行的可执行文件。

编译器还检查你的程序是否为有效的 C 语言程序。如果编译器发现错误,就将错误报告给你,而且不生成可执行文件。理解特定编译器的报错信息是你将要学习的另一种技能。

1.7 编程机制

用 C 语言编写一个程序时,你将编写的内容保存在一个被称为源代码文件的文本文件中。大多数 C系统,包括我们提到的那些,都需要该文件的名称以 .c 结尾:例如,wordcount.c 和
budget.c 。该名称还应该满足特定计算机操作系统的需要。例如,MS-DOS 是IBM PC及其兼容机的操作系统。它要求基本名不能大于8个字符长,所以前面提到的 wordcount.c名称不是一个合法的 DOS 文件名。一些 UNIX 系统对整个文件名长度,包括扩展名在内,有14个字符的限制,其他 UNIX 系统允许更长的名字,最长为 255个字符。 Linux,Windows 和 Macintosh OS 也允许长文件名。

1.7.1 目标代码文件、可执行文件和库

C 编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行机器语言代码。C 分两步完成这一工作:编译和链接。编译器将源代码转换为中间代码,链接器将此中间代码与其他代码相结合生成可执行文件。C 使用被划分为两部分的这一方法使程序便于模块化。你可分别编译各个模块,然后使用链接器将编译过的模块结合起来。这样,如果需要改变一个模块,则不必重新编译所有其他的模块。同时,链接器将你的程序与预编译的库代码结合起来。

编译都做了什么:编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析语法分析;语义检查和中间代码生成代码优化目标代码生成。

中间文件的形式有多种选择。最一般的选择,同时也是我们这里讲述的实现方式所采取的选择,是将源代码转换为机器语言代码,将结果放置在一个目标代码文件(或简称为目标文件)中(这里假定你的源代码由单个文件组成)。虽然目标文件包含机器语言代码,但该文件还不能运行。目标文件包含源代码的转换结果,但它还不是一个完整的程序。

目标代码文件中所缺少的第一个元素是一种叫做启动代码(start-up code)的东西,此代码相当于你的程序和操作系统之间的接口。例如,你可以在DOS或Linux下运行一个 IBM PC兼容机,在两种情况中硬件是相同的,所以会使用同样的目标代码,但DOS与Linux要使用不同的启动代码,因为这两种系统处理程序的方式是不同的。

所缺少的第二个元素是库例程的代码。几乎所有C程序都利用标准C库中所包含的例程(称为函数)。例如,前面的 concrete.c 使用了函数 printf()。目标代码文件不包含这一函数的代码,它只包含声明使用 printf()函数的指令。实际代码存储在另一个称为“库”的文件中。库文件中包含许多函数的目标代码。

链接器的作用是将这3个元素(目标代码,系统的标准启动代码和库代码)结合在一起,并将它们存放在单个文件,即可执行文件中。对库代码来说,链接器只从库中提取你所使用的函数所需要的代码,如下图中的简单示例:


concrete.c -> 源代码 -> 编译器 -> 目标代码 ->链接器 -> 可执行代码
concrete.obj 库代码+启动代码 concrete.exe

现在我们来看一些具体的系统

1.7.2 UNIX系统

因为C的流行开始于UNIX系统,所以我们首先讲述该系统。

一,在UNIX系统上编辑

UNIX C不具备自己的编辑器。但你可以使用一种通用 UNIX编辑器,例如emacs,jove,vi或
X-Windows等文本编辑器。

你要完成的两项重要工作是正确地输入程序并为存储该程序的文件选择一个合适的名称。如前所述,名称应以 .c结尾。注意,UNIX是区分大小写的。因此,budgete.c BUDGETE.C 和Budgete.c 是3个互不相同但都有效的 C 源文件名称,但 BUDGETE.C则不是有效的名称,因为它使用了大写的 C 而不是小写的 c。

二,在 UNIX 系统上编译

UNIX C编译器称为 cc。要编译 inform.c 程序,你需要键入下列内容:
cc.inform.c
要运行该文件,只须键入:

a.out

输出结果如下

A.c is used to end a C program filename

如果你希望保存该可执行文件(a.out),就必须对其进行重命名。否则,该文件会被下一次编译程序时产生的一个新的 a.out替代。

如何处理目标代码呢?cc编译器创建一个与源代码具有相同基本名但扩展名为.0的目标代码文件。在本例中,目标代码文件名为 inform.o 但你找不到该文件,因为链接器在可执行程序被生成后将该文件删除。然而,如果原始程序合作多个源代码文件,则会保存目标代码文件。后面讨论多文件程序时,你会看到这是一个很好的主意。


1.7.3 Linux系统

Linux 是一个流行的,开放源代码的,类似于 UNIX的操作系统,可在包括IBM兼容机和 Macintoshes 在内的多种平台上运行。在 Linux上准备 C 程序与在 UNIX系统上几乎一样,不同之处是你要使用由 GNU提供的被称为 gcc 的公共或 C 编译器。编译器命令将是下面的形式:

gcc inform.c

注意,在安装 Linux时 gcc 的安装可能是可选项,所以如果原来没有安装gcc,你必须进行安装。一般情况下,安装过程会将 cc 作为 gcc的别名,所以如果愿意,可以在命令行使用 cc 而不是 gcc。


1.7.4 集成开发环境 (Windows系统下)

因为 C 编译器不是标准 Windows 包的一部分,所以需要获得并安装一个 C 编译器。许多厂商,包括 Microsoft,Borland,Metrowerks 和Digital Mars,都提供基于 Windows的集成开发环境--或叫 IDE(目前,大多数是结合在一起的C和C++编译器)。

Windows IDE最初可能让人有一点望而生畏,因为它们提供多种目标,也就是说,提供了多种可让程序在其中运行的环境。例如,它们可能提供16位Windows程序,32位Windows程序,动态链接库文件(DLL)等等让你选择。许多目标都需要引入Windows图形界面的支持。为了管理这些(及其他)选项,通常需要创建一个项目,以便随后向其中添加将要使用的源代码文件名。具体步骤取决于所使用的产品。一般地,首先使用 File菜单或 Project菜单来创建一个项目。重要的是选取正确的项目形式。本书中的例子是一般性的例子,设计目的是在一个简单的命令行环境中运行。不同的Windows IDE提供一个或更多的选项以匹配这一不严格的假设。例如,Microsoft Visual C 7.1 提供Win32 Console Application 选项。对于Metrowerks CodeWarrior9.0,请选取Win32 C Stationery,然后选择 C Console App 或 WinSIOUX C App(后者具有更良好的用户界面)。

因为 Widnows IDE一般可处理 C 和 C++,所以你应该指明你需要一个C程序。以.c结尾

可能遇到的一个问题是:显示程序执行的窗口在程序终止时突然消失。如果遇到这种情况,那么可以使程序暂停,直到按下 Enter键。要做到这一点,请在程序的末尾,恰好在 return 语句之前,添加下面的一行:
getchar ();

该行读取一次按键,因此程序将暂停直到按下 Enter 键时。有时,根据程序函数的需要,可能已经有一个等待按键的指令。例如scanf() 在这种情况下,需要使用 getchar()两次:
getchar();
getchar();

1.7.5 IBM PC 的 DOS 编译器

许多 Widnows IDE 另外提供了允许你在 DOS 命令行环境中编程的命令行工具。在许多系统上(包括几种 UNIX 和 Linux变体)可用的 Comeau C/C++编译器,拥有一个命令行 DOS版本。另外,有许多在 DOS 下工作的属于免费软件和共享软件的 C 编译器。例如,有一种基于 DOS 的 GNU gcc 编译器版本。

源代码文件应该是文本文件,而不是字处理程序文件(字处理程序文件包含字体和格式方面的附加信息)。应该使用文本编辑器, 例如 Windows Notepad,某些 DOS 版本自带的 EDIT程序。如果使用字处理程序,则必须做用 Save As 来以文本格式保存文件。文件扩展名应该是 .c。某些字处理程序自动为文本文件添加 .txt扩展名。如果遇到这种情况,需要改变文件名,用 c 代替 txt。

PC 机的 C 编译器通常(但不总是)会生成以 .obj 为扩展名的中间目标代码文件。与 UNIX 编译器不同,C 编译器在完成编译时通常不会删除它们,有些编译器产生带有 .asm 扩展名的汇编语言文件或使用其自己的特殊格式。

有些编译器在编译后就会自动运行链接器,而其他编译器可能需要你手动运行链接器。链接将产生可执行文件,该可执行文件在原始的源代码基本名后添加 .exe 扩展名。例如,编译和链接一个名为 concrete.c 的文件作为替代。在任何一种情况下,都可以在命令行键入基本名来运行该程序:
C>concrete

1.7.6 Macintosh 上的 C

最著名的 Macintosh C/C++ 编译器是 Metrowerks CodeWarrior 编译器 (CodeWarrior 的 Windows 和 Macintosh 版本有非常相似的界面)。该编译器提供一个与 Windows 编译器中所看到的相似的基于项目的 IDE。 通过 File 菜单中选取 New
Project 来开始编译工作。编译器将提示你选择项目类型。对于较新的 CodeWarrior,请使用 Std C Console 选项 (在不同的 Code Warior 版本中找到该选项的路径也不相同)。

1.8 语言标准

目前,有许多 C 实现方式可用。理想情况下,编写 C 程序时,假如该程序末使用机器特定的编程技能,则它在任何实现方式中的运行应该是相同的。要在实践中做到这一点,不同的实现方式需要遵守一个公认的标准。

首先说明一点,C 没有官方的标准。不过,Brian Kernighan 和 Dennis Ritchie 编写的 The C Programming Language 第1版(1978)成为大家接受的标准,通常称为 K&R C 或经典 C。特别是这本书附录中的“C Reference Manual”已成为 C 实现的指南。例如,编译器都会声明它可提供一个完整的 K&R 实现。然而,虽然该附录定义了 C 语言,但是却没有定义 C 库。因为 C 比大多数其他语言更加依赖库,所以还需要一个库标准。因为缺乏任何官方标准,所以提供 UNIX 实现的库成为一个事实上的标准。


1.8.1 第1个 ANSI/ISO C 标准

附着 C 的发展和更加广泛地用于更多种类的系统上,使用 C 的群体意识到它需要一个更加全面,新颖和严格的标准。为了满足这一要求,美国国家标准代组织(ANSI)在1983年设立了一个委员会(X3J11)以发展一个新的标准,该标准于1989年正式采用。这个新标准(ANSI C)定义了语言和一个标准 C 库。国标标准化组织于1990年采用一个 C 标准 (ISO C )。ISO C 和 ANSI C 实质上是同一个标准。ANSI/ISO标准最终版本通常被称为 C89 (因为 ANSI于1989年批准了该标准) 或 C90(因为 ISO 于1990年批准了该标准)。然而,因为 ANSI版本是首先出现的,所以人们通常使用ANSI C这一术语。

1.8.2 C99标准

1994年,修订标准的工作开始了,这一努力的结果是产生了 C99标准。一个联合 ANSI/ISO委员会(即C9X委员会)签署了 C90标准的最初原则,包括保持言语短小而简单。他们的意图不是为语言添加新的特性,而是为了满足新的目标。新目标之一是支持国际化编程,例如,提供了处理国际字符集的方法。第二个目标是“整理现有的惯例以解决明显的缺点”。因此,在遇到需要将 C 移植到 64 位处理器时,委员会根据在真实生活中处理问题的人的经验来添加标准。第三个目标是针对科学和工程项目的重要数字计算改进 C 的适应能力。

这三点(国际化,修正其不足和改进计算的实用性)是主要的面向改变的目标。形成在关于更改的计划在性质上更加保守,例如,让与 C90 和 C++ 的不兼容性达到最小,让语言在概念上保持简单。用委员会的话来说就是“。。。委员会希望 C++成为重要的和强有力的语言”。

结果是 C99 的修改保持了 C 的本质特性,C 继续是一种简短,清楚,高效的语言。本书指出了 C99中的许多修改。因为目前大多数编译器没有完全实现所有 C99的修改,所以你可以会发现一些修改在你的系统上不可用。或者你可能会发现,只有修改编译器的设置以后,才能够看到一些 C99 的特性。

PS :标准的命名惯例
本书将使用术语 ISO/ANSI C 来表示两个标准共有的特性,使用 C99 指新的特性。有时也用用 C90,例如,在讲述一个特性第一次被加入到 C 时。

1.12复习题

1.就编程而言,可移植性表示什么?

答:一个程序的可移植性好,就是指它的源代码不经修改就可以在多种不同的计算机系统上编译成可以成功运行的程序。


2.解释源代码文件,目标代码文件和可执行文件之间的区别

答:源代码包括程序员使用任何语言编写的代码。目标代码文件包含着机器语言代码,它并不需要是完整的程序代码。可执行文件包含着组成可执行程序的全部机器语言代码。


3.编程的7个主要步骤是什么?

答:1.定义程序目标
2.设计程序
3.编写程序代
4.编译程序
5.运行程序。
6.测试和调试程序。
7.维护和修改程序。


4.编译器的任务是什么?

答:编译器把源代码(例如,用 C 语言写成的代码)转换为机器语言代码,也称对象代码。

 

5.链接器的作用是什么?

答:链接器把多个源(例如,已编译的源代码,库代码和启动代码)的目标代码连接成一个单独 可执行程序。

在本章中你将学习下列内容
------------------------------------------------------------------
1.运算符:=

2.函数:main(),printf()

3.编写一个简单的 C 程序。

4.创建整形变量,为其赋值,并在屏幕上显示该值。

5.换行字符。

6.如何在程序中加入注释,建立包含多个函数的程序,以及找出程序中的错误。

7.理解什么是关键字

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!