----------------------- Page 1-----------------------
下载
第1章  基 本 概 念
本章首先对C语言做简要介绍。目的是通过实际的程序向读者介绍 C语言的本质要素,而不
是一下子就陷入到具体细节、规则及例外情况中去。因此,在这里我们并不想完整地或很精确
地对C语言进行介绍(但所举例子都是正确的)。我们想尽可能快地让读者学会编写有用的程序,
因此,重点介绍其基本概念:变量与常量、算术运算、控制流、函数、基本输入输出。本章并
不讨论那些编写较大的程序所需要的重要特性,包括指针、结构、大多数运算符、部分控制流
语句以及标准库。
这样做也有缺陷,其中最大的不足之处是在这里不到对任何特定语言特性的完整描述,
并且,由于太简略,也可能会使读者产生误解。而且,由于所举的例子没有用到 C语言的所有特
性,故这些例子可能并未达到简明优美的程度。我们已尽力缩小这种差异。另一个不足之处是,
本章所讲过的某些内容在后续有关章节还必须重复介绍。我们希望这种重复带给读者的帮助会
胜过烦恼。
无论如何,经验丰富的程序员应能从本章所介绍的有关材料中推断他们在程序设计中需要
的东西。初学者则应编写类似的小程序来充实它。这两种人都可以把本章当作了解后续各章的
详细内容的框架。
1.1  入门
学习新的程序设计语言的最佳途径是编写程序。对于所有语言,编写的第一个程序都是相
同的:
打印如下单词:
hello, world
在初学语言时这是一个很大的障碍,要越过这个障碍,首先必须建立程序文本,然后成功地对
它进行编译,并装入、运行,最后再看看所产生的输出。只要把这些操作细节掌握了,其他内
容就比较容易了。
在C语言中,用如下程序打印“hello,          world ”:
#include <stdio.h>
main()
{
printf("hello, world\n");
}
至于如何运行这个程序取决于使用的系统。作为一个特殊的例子,在 U N I X操作系统中,必
须首先在某个以“. c”作为扩展名的文件中建立起这个程序,如h e l l o . c ,然后再用如下命令编译
-
---------------------- Page 2-----------------------
2计计C 程序设计语言
下载
它:
cc hello.c
如果在输入上述程序时没有出现错误(例如没有漏掉字符或错拼字符),那么编译程序将往
下执行并产生一个可执行文件a . o u t 。如果输入命令
a. out
运行a . o u t程序,则系统将
打印
hello, world
在其他操作系统上操作步骤会有所不同,读者可向身边的专家请教。
#include <stdio.h>          包含有关标准库的信息
main()                      定义名为main的函数,它不接收变元值
{                            main的语句括在花括号中
printf("hello, world\n"); main函数调用库函数printf打印字符序列,\n代表换行符
}
下面对这个程序本身做一些解释说明。每一个C程序,不论大小如何,都由函数和变量组成。
函数中包含若干用于指定所要做的计算操作的语句,而变量则用于在计算过程中存储有关值。 C
中的函数类似于F O RT R A N语言中的子程序与函数或P a s c a l语言中的过程与函数。在本例中,函
数的名字为m a i n 。一般而言,可以给函数任意命名,但 m a i n是一个特殊的函数名,每一个程序
都从名为m a i n 的函数的起点开始执行。这意味着每一个程序都必须包含一个 m a i n函数。
m a i n 函数通常要调用其他函数来协助其完成某些工作,调用的函数有些是程序人员自己编
写的,有些则由系统函数库提供。上述程序的第一行
#include <stdio.h>
用于告诉编译程序在本程序中包含标准输入输出库的有关信息。许多 C源程序的开始处都包含这
一行。我们将在第7章和附录B 中对标准库进行详细介绍。
在函数之间进行数据通信的一种方法是让调用函数向被调用函数提供一串叫做变元的值。
函数名后面的一对圆括号用于把这一串变元(变元表)括起来。在本例子中,所定义的  m a i n函
数不要求任何变元,故用空变元表()表示。
函数中的语句用一对花括号{ }括起来。本例中的m a i n函数只包含一个语句:
printf("hello, world\n");
当要调用一个函数时,先要给出这个函数的名字,再紧跟用一对圆括号括住的变元表。上
面这个语句就是用变元 "hello,      world\n"  来调用函数p r i n t f 。p r i n t f是一个用于打印输出的库函数,
在本例中,它用于打印用引号括住的字符串。
用双引号括住的字符序列叫做字符串或字符串常量,如 "hello,                  world\n"就是一个字符串。目
前仅使用字符串作为p r i n t f及其他函数的变元。
在C语言中,字符序列\ n表示换行符,在打印时它用于指示从下一行的左边换行打印。如果
在字符串中遗漏了\ n      (一个值得做的试验),那么输出打印完后没有换行。在p r i n t f 函数的变元中
必须用\ n 引入换行符,如果用程序中的换行来代替\ n ,如:
printf("hello, world
----------------------- Page 3--------------------
---
第1章    基 本 概 念计计3
下载
");
那么C编译器将会产生一个错误信息。
p r i n t f 函数永远不会自动换行,我们可以多次调用这个函数来分阶段打印一输出行。上面给
出的第一个程序也可以写成如下形式:
#include <stdio.h>
main()
{
printf("hello, ");
printf("world");
printf("\n");
}
它所产生的输出与前面一样。
请注意,\ n只表示一个字符。诸如\ n等换码序列为表示不能打印或不可见字符提供了一种通
用可扩充机制。除此之外, C语言提供的换码序列还有:表示制表符的 \ t ,表示回退符的\ b ,表
示双引号的 \ " ,表示反斜杠符本身的 \ \ 。2 . 3节将给出换码序列的完整列表。
练习1-1    请读者在自己的系统上运行“hello, world ”程序。再做个实验,让程序中遗漏一
些部分,看看会出现什么错误信息。
练习1-2    做个实验,观察一下当p r i n t f 函数的变元字符串中包含\ c              (其中c是上面未列出的某
个字符)时会出现什么情况。
1.2  变量与算术表达式
下面的程序用公式
˚C = (5/9) (˚F-3 2 )
打印华氏温度与摄氏温度对照表:
0    -17
20    -6
40      4
60    15
80    26
100    37
120    48
140    60
160    71
180    82
200    93
220  104
240  115
260  126
280  137
----------------------- Page 4-----------------------
4计计C 程序设计语言
下载
300    148
c语言基本名词概念
这个程序本身仍只由一个名为m a i n 的函数的定义组成,它要比前面用于打印“hello,                                world ”的
程序长,但并不复杂。这个程序中引入了一些新的概念,包括注解、说明、变量、算术表达式、
循环以及格式输出。该程序如下:
#include <stdio.h>
/* 对 fahr = 0, 20, ..., 300
打印华氏温度与摄氏温度对照表 */
main()
{
int  fahr, celsius;
int  lower, upper, step;
lower = 0;      /* 温度表的下限  */
upper = 300 ;  /* 温度表的上限  */
step  = 20;    /* 步长  */
fahr = lower;
while  (fahr <= upper)  {
celsius = 5 * (fahr-32) / 9;
printf("%d\t%d\n", fahr, celsius);
fahr = fahr + step;
}
}
其中的两行
/* 对fahr=0, 20, ..., 300
打印华氏温度与摄氏温度对照表 */
叫做注解,用于解释该程序是做什么的。夹在/ *与* /之间的字符序列在编译时被忽略掉,它们可
以在程序中自由地使用,目的是为了使程序更易于理解。注解可以出现在任何空格、制表符或
换行符可以出现的地方。
在C语言中,所有变量都必须先说明后使用,说明通常放在函数开始处的可执行语句之前。
说明用于声明变量的性质,它由一个类型名与若干所要说明的变量组成,例如
int  fahr, celsius;
int  lower, upper, step;
其中,类型i n t表示所列变量为整数变量,与之相对, f l o a t表示所列变量为浮点变量(浮点数可
以有小数部分)。i n t与f l o a t类型的取值范围取决于所使用的机器。对于 i n t类型,通常为1 6位(取
值在-3 2 7 6 8 ~ + 3 2 7 6 7之间),也有用3 2位表示的。f l o a t类型一般都是3 2位,它至少有6位有效数字,
-3 8  + 3 8
取值范围一般在1 0        ~1 0  之间。
除i n t与f l o a t之外,C语言还提供了其他一些基本数据类型,包括:
c h a r    字符—单字节
s h o r t  短整数
----------------------- Page 5-----------------------
第1章  基 本 概 念计计5
下载
l o n g  长整数
d o u b l e 双精度浮点数
这些数据类型对象的大小也取决于机器。另外,还有由这些基本类型组成的数组、结构与联合
类型、指向这些类型的指针类型以及返回这些类型的函数,我们将在后面适当的章节再分别介
绍它们。
上面温度转换程序计算以4个赋值语句
lower = 0;
upper = 300 ;
step  = 20;
fahr = lower;
开始,用于为变量设置初值。各个语句均以分号结束。
温度转换表中的每一行均以相同的方式计算,故可以用循环语句来重复产生各行输出,每
行重复一次。这就是w h i l e循环语句的用途:
while (fahr <= upper) {
.
. .
}
w h i l e循环语句的执行步骤如下:首先测试圆括号中的条件。如果条件为真(  f a h r小于等于
u p p e r ),则执行循环体(括在花括号中的三个语句)。然后再重新测试该条件,如果为真,则再
次执行该循环体。当该条件测试为假( f a h r大于u p p e r )时,循环结束,继续执行跟在该循环语
句之后的下一个语句。在本程序中,循环语句后再没有其他语句,因此整个程序终止执行。
w h i l e语句的循环体可以是用花括号括住的一个或多个语句(如上面的温度转换程序),也可
以是不用花括号括住的单个语句,例如:
while  (i < j)
i = 2 * i;
在这两种情况下,我们总是把由w h i l e控制的语句向里缩入一个制表位(在书中以四个空格表示),
这样就可以很容易地看出循环语句中包含那些语句。这种缩进方式强化了程序的逻辑结构。尽
管C编译程序并不关心程序的具体形式,但使程序在适当位置采用缩进空格的风格对于使程序更
易于为人们阅读是很重要的。我们建议每行只写一个语句,并在运算符两边各放一个空格字符
以使运算组合更清楚。花括号的位置不太重要,尽管每个人都有他所喜爱的风格。我们从一些
比较流行的风格中选择了一种。读者可以选择自己所合适的风格并一直使用它。
绝大多数任务都是在循环体中做的。循环体中的赋值语句
celsius = 5 * (fahr-32) / 9;
用于求与指定华氏温度所对应的摄氏温度值并将值赋给变量 c e l s i u s 。在该语句中,之所以把表达
式写成先乘5然后再除以9而不直接写成5 / 9,是因为在C语言及其他许多语言中,整数除法要进
行截取:结果中的小数部分被丢弃。由于 5和9都是整数,5 / 9相除后所截取得的结果为0,故这样
所求得的所有摄氏温度都变成0 。
这个例子也对p r i n t f函数的工作功能做了更多的介绍。p r i n t f是一个通用输出格式化函数,第
7章将对此做详细介绍。该函数的第一个变元是要打印的字符串,其中百分号( % )指示用其他
----------------------- Page 6-----------------------
6计计C 程序设计语言
下载
变元(第2、第3个…变元)之一对其进行替换,以及打印变元的格式。例如, % d指定一个整数
变元,语句
printf("%d\t%d\n", fahr, celsius);
用于打印两个整数f a h r与c e l s i u s值并在两者之间空一个制表位(\ t )。
p r i n t f 函数第1个变元中的各个%分别对应于第2个、第3个… 第n个变元,它们在数目和类型
上都必须匹配,否则将出现错误。
顺便指出, p r i n t f 函数并不是 C语言本身的一部分, C语言本身没有定义输入输出功能。
p r i n t f是标准库函数中一个有用的函数,标准库函数一般在 C程序中都可以使用。A N S I标准中定
义了p r i n t f 函数的行为,从而其性质在使用每一个符合标准的编译程序与库中都是相同的。
为了集中讨论C语言本身,在第7章之前的各章中不再对输入输出做更多的介绍,特别是把
格式输入延后到第7章。如果读者想要了解数据输入,请先阅读 7 . 4节对s c a n f函数的讨论。s c a n f
函数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。