第一章 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