第一章 C语言概述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UNIX系统最初是用汇编语言编写的,用汇编语言编写的程序往往难以调试和扩展。

Thompson意识到需要用一种更加高级的编程语言来完成 UNIX 系统未来的开发,于是他设计了一种小型语言——B语言。

B语言是在BCPL语言(20世纪60年代中期产生的一种系统编程语言)的基础上开发的,而BCPL语言又可以追溯到最早的语言之一 ——Algol 60。

不久,Ritchie也加入到UNIX项目中,并且开始着手用B语言编写程序。

1970年,贝尔实验室为UNIX项目争取到一台PDP-11计算机。

当B语言经过改进并能够在PDP-11计算机上运行后,Thompson用B语言重新编写了部分UNIX代码。

到了1971年,B语言已经明显不适合PDP-11计算机了,于是Ritchie着手开发B语言的升级版。

最初,他将新开发的语言命名为NB语言(意为“New B”),但是后来新语言越来越偏离B语言,于是他将其改名为C语言。

到了1973年,C语言已经足够稳定,可以用来重新编写UNIX系统了。

改用C语言编写程序有一个非常重要的好处:可移植性。

只要为其他计算机编写C语言编译器, UNIX 系统就能运行在那些机器上。

2.编写一个简单的C程序
按照惯例,我们用C语言编写一个打印 Hello world.的程序。

//H ello W orld.c
#in c lude <stdio.h>
int m a in(void){
printf("H ello world.\n");
return0;
}
这个程序虽然简短,但是它包含了C语言程序的基本结构。

接下来,我们对这个程序做一个简单的说明。

#in c lude<stdio.h>是一条预处理指令,它表示在程序中"包含" stdio.h 头文件,这个头文件中有C语言标准输入/输出库的信息。

m a in函数是程序的入口,m a in函数中的第一行代码是用来打印信息的。

printf 函数来自于标准输入/输出库,它可以产生格式化的输出。

\n是一个转义序列,它表示换行。

第二行代码return0;有两个作用:一是终止m a in函数,这样其实也就终止了整个程序。

二是程序终止时会向操作系统返回状态码0。

2.1编译和链接
虽然 HelloWorld.c 很简单,但是为了运行这个程序,却需要涉及很多内容。

我们需要把文本形式的 HelloWorld.c 转换成计算机可以执行的形式。

对 C 程序来说,通常包含下面4个步骤:
预处理。

首先程序会由预处理器(preprocessor)进行处理。

预处理器执行以#开头的指令。

预处理器做的事情很简单,主要是把头文件中内容 copy 到源代码文件中,或者是对宏进行文本替换。

1.#in c lude:头文件包含
2.#define N5:宏定义
3.#define FOO(x)(1 + (x)*(x)):带参数的宏(宏函数)
编译。

经过预处理器处理的文件会交给编译器进行编译。

编译器会把程序翻译成对应平台的汇编代码。

汇编。

汇编器会把生成的汇编代码翻译成对应平台的机器代码(目标代码)。

然而程序现在是不能运行的,还需要经过最后一个步骤——链接。

链接。

在链接阶段,链接器会把由汇编器生成的目标代码和程序需要的其他附加代码整合在一起,生成最终可执行的程序。

这些附加代码包括程序中用到的库函数(如printf函数)。

幸运的是,这些工作都不需要我们操心,已经由先辈们完成了。

我们只需要点几个按钮,或者输入几行命令就行了。

注意:在C/C++中,编译单元为源文件。

也就是说我们会对每一个源文件进行编译,生成对应的目标文件。

然后将多个目标文件链接在一起,生成可执行程序。

2.2进程虚拟空间
程序经过预处理、编译和链接,最终生成可执行文件。

可执行文件被操作系统加载到内存,程序才得以运行。

运行的程序我们称之为进程(process)。

每个进程都有自己的虚拟内存空间,如下所示:
3.变量和赋值
很少有程序会像 HelloWorld.c 那样简单。

大多数程序在产生输出之前都需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法。

和大多数编程语言一样,C语言中的这类存储单元被称为变量(variable)。

3.1类型
每一个变量都必须有一个类型(why?)。

类型用来说明变量所存储数据的种类。

C语言有各种各样的类型。

但是现在,我们只简单地讲两种类型:int 类型和 float 类型。

类型会影响变量的存储方式以及允许对变量进行的操作,所以选择合适的类型是非常关键的。

int 类型的变量可以存储整数,如:0,9527,-1等。

float 类型变量可以存储小数,如:3.14,-0.123等。

3.2声明
在使用变量之前必须对其进行声明,声明的格式如下:
类型变量名;
例如,我们可以这样声明变量 height 和 profit:
int height;
flo a t profit;
如果几个变量具有相同的类型,我们可以把它们的声明合并:
int height,length,width,volume;
flo a t profit,loss;
3.3赋值
变量通过赋值操作获取值。


height = 8;
length = 12;
width = 10;
我们通常会把一个浮点数赋值给 float 类型的变量,而且往往会在浮点数后面添加字母f。

如:
profit = 2150.48f;
一旦变量被赋值,我们就可以用它来计算其他变量的值:
height = 8;
length = 12;
width = 10;
volumn = height*length*width;
3.4显示变量的值
我们可以用printf显示变量的值。

如:
printf("H eight: %d\n",height);
其中%d 是占位符,我们称之为转换说明(conversion specification),它是用来指明变量 height 在显示中的位置。

下面是一些合法的标识符:
5.输入
在 C 标准库有一个与printf相对应的函数s ca nf,它可以获取用户的输入。

s ca nf函数和printf函数都需要使用格式串来指定输入或输出数据的格式。

我们可以像下面这样,读入一个 int 类型的值:
s ca nf("%d",&i);
其中%d 说明 scanf 读入的是一个整数值,i 是一个 int 类型的变量。

我们可以使用%f 读入一个 float 类型的值:
s ca nf("%f",&x);
其中 x 是一个 float 类型的变量。

课堂小练习
华氏温度转摄氏温度。

程序提示用户输入一个华氏温度,然后输出一个对应的摄氏温度。

公式:
6.为常量定义名字
当程序含有一些有特殊意义的常量时(比如32.0f),建议给这些常量定义名字,以免别人在阅读程序不知道这个常量的含义。

在 C 语言中我们可以采取宏定义的方式给常量命名:
#define FREEZING_PT32.0f
这里的#define是预处理指令,类似于#in c lude,因而结尾处也没有分号。

在预处理阶段,预处理器会把每一个宏替换为其表示的值。

我们还可以利用宏来定义表达式,如:
#define SCALE_FACTOR(5.0f/9.0f)
当宏表示一个表达式时,我们最好用括号把表达式括起来(why?)。

相关文档
最新文档