第一章 C语言概述

  • 格式:pdf
  • 大小:682.14 KB
  • 文档页数:9

第一章:C语言概述

语言的起源1. C

编写一个简单的2. C程序

2.1 编译和链接

2.2 进程虚拟空间

3. 变量和赋值

3.1 类型

3.2 声明

3.3 赋值

3.4 显示变量的值

3.5 初始化

标识符4.

4.1 关键字

输入5.

6. 为常量定义名字

第一章:C语言概述

1. C 语言的起源

C 语言是贝尔实验室的Ken Thompson、Dennis Ritchie等人开发的UNIX 操作系统的

“副产品”。Thompson独自编写出了最初版本的 UNIX 操作系统,这套系统运行在只有

16KB内存的 DEC PDP-7计算机上。

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. 的程序。

//HelloWorld.c#include

int main(void) { printf("Hello world.\n"); return 0;}这个程序虽然简短,但是它包含了C语言程序的基本结构。接下来,我们对这个程序

做一个简单的说明。

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

main 函数是程序的入口,main 函数中的第一行代码是用来打印信息的。printf 函数来自于标准输入/输出库,它可以产生格式化的输出。\n 是一个转义序列,它

表示换行。

第二行代码 return 0; 有两个作用:一是终止 main函数,这样其实也就终止了整

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

2.1 编译和链接

虽然 HelloWorld.c 很简单,但是为了运行这个程序,却需要涉及很多内容。我们需要

把文本形式的 HelloWorld.c 转换成计算机可以执行的形式。对 C 程序来说,通常包

含下面 4 个步骤:

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

头的指令。预处理器做的事情很简单,主要是把头文件中内容 copy 到源代码文件

中,或者是对宏进行文本替换。

1. #include:头文件包含

2. #define N 5:宏定义

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:

如果几个变量具有相同的类型,我们可以把它们的声明合并:

3.3 赋值

变量通过赋值操作获取值。如

我们通常会把一个浮点数赋值给 float 类型的变量,而且往往会在浮点数后面添加字母 f。如:

一旦变量被赋值,我们就可以用它来计算其他变量的值:

3.4 显示变量的值

我们可以用 printf 显示变量的值。如:

其中 %d 是占位符,我们称之为转换说明 (conversion specification),它是用来指明

变量 height 在显示中的位置。类型 变量名;

int height;float profit;

int height, length, width, volume;float profit, loss;

height = 8;length = 12;width = 10;

profit = 2150.48f;

height = 8;length = 12;width = 10;volumn = height * length * width;

printf("Height: %d\n", height);

%d 仅适用于 int 类型变量,如果要显示 float 类型变量,需要用 %f 来代替 %d。默认情况下,%f 会显示出小数点后 6 位数字。如果要强制 %f 显示小数点后 p 位数字,可以

把 .p 放置在 % 和 f 之间,如:

C 语言没有限制 printf 可以显示变量的数量,我们可以同时显示多个变量的值:

3.5 初始化

当程序开始执行时,某些变量会被自动设置为零,而大多数变量不会。没有默认值并

且尚未在程序中被赋值的变量是未初始化的。

注意:试图访问未初始化的变量,其行为是未定义的。在有些编译器中,可能会得到

一个无意义的值;在另一些编译器中,则可能发生更坏的情况 (如程序崩溃)。

我们当然可以采用赋值的方式给变量赋初始值,但C语言还提供了一个更简便的方

法:在声明变量的同时赋初始值。如:

其中数值 8 是一个初始化式 (initializer)。

在一个声明语句中,可以对任意数量的变量进行初始化:

注意,上面每一个变量都有自己的初始化式。如果写成这样:

则只有变量 width 被初始化了。

4. 标识符

在编写程序时,需要对变量、函数、宏等内容进行命名。这些名字我们称为标识符

(identifier)。在C语言中,标识符可以含有字母、数字和下划线,但是必须以字母或者下划线开头。

下面是一些合法的标识符:printf("Profit: $%.2f\n", profit);

printf("Height: %d Length: %d Width: %d\n", height, length, width);

int height = 8;

int height = 8, length = 12, width = 10;

int height, length, width = 10;

关键字

autoenumrestrict (C99)unsigned

breakexternreturnvoid

casefloatshortvolatile

charforsignedwhile

constgotosizeof_Bool (C99)

continueifstatic_Complex (C99)

defaultinline (C99)struct_Imaginary (C99)

dointswitch 

doublelongtypedef 

elseregisterunion 接下来是一些不合法的标识符 (why?):

C语言是区分大小写的。比如,下面的标识符全都不同:

上述8个标识符是可以同时使用的 (但强烈不建议这么做)。

很多C语言程序员会遵循在标识符中只使用小写字母的规范 (宏命名除外)。为了使名

字清晰,必要时还会插入下划线:

而另外一些程序员,为了避免下划线,他们会把标识符中的单词首字母大写:

4.1 关键字

对 C 编译器有特殊意义的名称,我们称为关键字 (keyword)。关键字是不能作为标识

符来使用的。下表罗列了 C 语言所有的关键字:times10, get_next_char, _done

10times, get-next-char

job, Job, jOb, joB, JOb, JoB, jOB, JOB

symbol_table, current_page, name_and_address

symbolTable, currentPage, nameAndAddress