C语言导论.docx
- 文档编号:7346658
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:66
- 大小:34.90KB
C语言导论.docx
《C语言导论.docx》由会员分享,可在线阅读,更多相关《C语言导论.docx(66页珍藏版)》请在冰豆网上搜索。
C语言导论
第1章C语言导论
为什么称之为C语言?
这通常是C程序设计语言初学者最先提出的问题之一。
答案为C语言是从B
语言演变而来!
但B语言不是从A语言演变而来,而是从BCPL(BasicCombinedProgrammingLanguage)语言演变而来。
BCPL是由MartinRichards在1967年设计出来的,是一种无数据类型的语言,它直接处
理机器系统的字和地址。
在BCPL的启发下,KenThompson在1970年开发了无数据类型的程序设计语言
B,B语言和汇编语言被用来开发UNIX操作系统的第一个版本。
1972年,DennisRitchie设计出了C语
言,该语言既吸收了BCPL和B语言的许多思想,又具备数据有类型的特色(整型、浮点型等)。
直到1989年,C语言的定义还是沿用了BrianW.Kernighan和DennisM.Ritchie在TheCProgramming
Language(EnglewoodCliffs,NJ:
Prentice-Hall,1978)一书中的描述,我们称C语言的这个版本为传统C
语言。
由于该语言的发展和扩充、最初定义中有一些不明确之处以及出于其他方面的考虑,
1983
年,美
国国家标准化协会(
ANSI)组织一个委员会“提供明确的和与机器无关的
C语言的定义”,并于
1989年
通过了所制定的标准。
本书介绍的C语言基于ANSIC标准,此后简称为标准
本章将举例介绍一些基本的语言概念:
C语言程序的结构、标识符、while
C语言。
和dowhile
循环、条件语
句(if-else)、输入、输出和文件,在以后的章节中会就这些主题展开详细描述。
1.1第一个C语言程序
下列程序打印输出的信息如下:
ANSI--AkinderandgentlerC!
/*该程序打印输出如下信息:
ANSI--AkinderandgentlerC!
*/
#include
main()
{
printf("ANSI--AkinderandgentlerC!
\n");
}
在C语言中,符号/*标记注释行的开始,符号*/标记注释行的结束,编译器忽略注释行。
如下行是一条预处理指令(preprocessordirective):
#include
它表示在把程序实际翻译成机器代码之前还需要做某个预处理动作(预处理器在编译之前执行预处理指
令,将在4.6节详细介绍预处理器)。
预处理指令总是以井号(#)开头。
这里的#include预处理指令使得
预处理器把名为stdio.h的文件内容准确地插入到#include行出现的地方,这样的文件称为头文件(header
file),扩展名.h即来自于这种命名法。
实际上,头文件stdio.h提供使用库函数printf的适当接口。
附录B
列出了标准所要求的头文件,附录D列出了一些有用的库函数以及对应需要的头文件。
一个C语言程序由一个或多个函数(function)组成,其中必须有一个main函数。
程序从main函数
开始执行。
任何一个函数的所有语句用一对大括号
{}
括起来。
在本例中,程序仅由一个
main
函数组成,
该main函数仅含一条语句:
printf("ANSI--Akinderandgentlerc!
\n");
C语言中的单条语句,如:
printf("ANSI--AkinderandgentlerC!
\n");
是以分号“;”结束的。
除了特殊的字符如反斜杠“”之外,函数printf简单地复制两个双引号里面的字符到视频显示器上。
因此如下语句:
printf("ANSI--AkinderandgentlerC!
\n");
在屏幕上打印输出:
ANSI--AkinderandgentlerC!
反斜杠“”作为特殊的转义字符。
字符组合\n的意思是换行,并使下一个输出从下一行的行首开始,这里下一个输出是系统提示符。
像大部分现代高级语言编译器一样,C语言编译器不需要程序的语句以任何特定的格式出现。
本书格式化编写的程序,尤其是采用缩排的形式,目的是便于阅读。
附录F描述如何在BorlandC++和Windows下的MicrosoftVisualC++中编译、连接和运行C语言程序。
附录E讨论UNIXC编译器。
练习
1.在你的系统上编译运行本节的程序。
2.修改并运行本节的程序。
尝试删除程序的某部分,例如省略如下行:
#include
再如,省略一个大括号,省略一个双引号。
若有错误的话,说明是什么错误,并解释这些错误。
1.2应用举例:
长度转换
◇问题
从键盘读入以码(yd)为单位的长度,把该长度转化成对应的英尺(ft)和英寸(in),并将转换后的
长度输出到屏幕上。
假设输入的长度是非负整数(如:
0,1,2,中的一个),程序以输入负数结束(如:
-1,-2,中的一个)。
这些单位之间的换算关系如下:
1yd=3ft
1yd=36in
◇输入/输出举例
输入部分用斜体字标出,输出部分用黑体字标出,如下所示:
Enternextlength
2
2yd=
6ft
72in
Enternextlength
30
30yd=
90ft
1080in
Enternextlength–99
***ENDOFPROGRAM***
◇用
C语言实现
/*
程序从键盘读入以码(yd)为单位的长度,把该长度转化成对应的英尺
并将转换后的长度输出到屏幕上。
(ft)
和英寸(in),
假设输入的长度是非负整数,程序以输入负整数结束。
*/
#include
main()
{
intyard,foot,inch;
printf("Enternextlength");
scanf("%d",&yard);
while(yard>=0){
foot=3*yard;
inch=36*yard;
printf("\n%dyd=\n",yard);
printf("%dft\n",foot);
printf("%din\n",inch);
printf("Enternextlength");
scanf("%d",&yard);
}
printf("***ENDOFPROGRAM***\n");
}
◇讨论
在C语言中所有变量都必须在被定义后才能使用。
在C语言中定义变量就是为特定数据类型的变量申请存储空间。
本程序首先定义3个变量yard、foot和inch:
intyard,foot,inch;
因为这些变量被定义为int类型(整型),所以每个变量都能存储一个有符号整数。
我们把类型(如:
int
型)对应的存储空间称为单元(cell)。
定义变量yard、foot和inch的结果如图1.1(a)所示。
这时,这些
单元所含的值与系统有关,不能认为每个单元存储的值是零或其他特殊的值。
一般说这些单元含有“垃圾
数据”,因为它们现在所含的值对程序是无意义的。
可以在定义变量yard、foot和inch的同时对它们进行
初始化。
例如,下面语句定义变量
yard、foot
和inch:
intyard=0,foot=1,inch=8;
同时初始化
yard值为
0、foot
值为
1和inch
值为
8,如图
1.1所示。
yard
foot
inch
(a)分配
3个存放整型数的单元
yard
foot
inch
0
1
8
(b)赋初值
图1.1分配3个整型单元并初始化其值
为了提示用户输入长度,程序使用了在1.1节中介绍的printf函数。
其中由双引号括起来的字符串称
为格式字符串(formatstring),由于该格式字符串不包含特殊字符(如,反斜杠),当执行下列语句时:
printf("Enternextlength");
将在显示器上输出如下信息:
Enternextlength
其次,本程序使用库函数scanf从键盘读入一个整数,函数scanf也需要一个格式字符串。
一个scanf
的格式字符串包含一个或多个以百分号(%)作为标志的格式描述符(formatdescriptors),这些格式描述
符决定了下一个输入项的类型(如int型)和如何存储这个值(如按二进制补码表示一个有符号整数)。
跟
在格式字符串之后的是那些将用于存储数据的单元的地址,符号&称为地址运算符(addressoperator)。
例如,&yard的值是yard单元的地址。
必须给函数scanf提供变量的地址,这样函数scanf就知道将输入的
内容存储到何处,因此执行如下语句时:
scanf("%d",&yard);
读取下一个由用户提供的数值,将它解释成十进制整数并存储到变量yard中(位于地址
在scanf语句之后是while循环。
注意while循环的如下循环体是由大括号括起来的,
&yard处)。
右大括号后面并
没有分号。
foot=3*yard;
inch=36*yard;
printf("\n%dyd=\n",yard);
printf("%dft\n",foot);
printf("%din\n",inch);
printf("Enternextlength");
scanf("%d",&yard);
若while循环的循环体只由一条语句组成,则大括号可以省略。
只要while循环中的如下条件成立,就将执行while循环体:
yard>=0
除了>=(大于或等于)之外,C语言提供了如下关系运算符:
>大于
<小于
<=小于或等于
==等于
!
=不等于
while
循环体中的第一条语句如下:
foot=3*yard;
赋值运算符是=,乘法运算符是*。
这样在执行该语句后,行该语句后的情形如图1.2所示。
假设yard的值是8,如图
3和yard值的乘积被存储到变量foot中,执
1.2所示,foot单元存储的值是24。
当执行while
循环体中的如下语句后,
36和yard值的乘积被存储到变量
inch
中:
inch=36*yard;
yard
foot
inch
8
24
图1.2
执行完赋值语句
foot=3*yard
的情形
while
循环体中下一条语句如下:
printf("\n%dyd=\n",yard);
这时如下格式字符串包含特殊字符反斜杠(
)和百分号(
%):
"\n%dyd=\n"
在1.1节中可以看到,printf格式字符串中的字符组合\n(换行)使得下一个输出结果从下一行的第一
列开始。
与scanf格式字符串一样,printf格式字符串中的百分号(%)指示一个格式描述符。
为了将变量
的内部表示转换为可打印形式,函数printf使用格式描述符。
格式描述符%d是指把printf中给出的变量(本
例为
yard)的值按十进制整数形式输出。
随后的如下字符无特别的含义,被直接输出到屏幕上:
yd=
最后的字符
\n
使得下一个输出从下一行的第一列开始。
例如,如果
yard的值是
2,在执行如下语句后:
printf("\n%dyd=\n",yard);
在下一行第一列开始,输出:
2yd=
并且,下一个输出将从下一行的第一列开始。
注意:
在
scanf中的变量名前写地址运算符(
&),但却不在
printf
中的变量名前写符号
&。
对
printf
来说,
知道变量的值已足够,而无须知道其地址。
例如,如果
yard的值是
2,就传给
printf
值2(在
printf
中包含变量
在执行while
yard),printf将输出2,printf循环体内的如下语句时:
无须知道
2存储在何处(即
yard的地址)。
printf("%dft\n",foot);
输出foot的值,随后原样输出字母:
ft
并且下一个输出将从下一行的第一列开始。
例如,若foot的值是6,则输出:
6ft
下一个输出将从下一行的第一列开始。
在执行while循环体内如下语句时:
printf("%din\n",inch);
输出inch的值,并随后原样输出字母:
in
则下一个输出将从下一行的第一列开始。
例如,若inch值是72,就输出:
72in
下一个输出将从下一行的第一列开始。
执行while循环体的最后两行语句:
printf("Enternextlength");
scanf("%d",&yard);
再次出现提示,函数scanf用来读取yard的下一个值。
只要用户输入一个负整数,while循环中如下条件
就不成立:
yard>=0
至此while循环结束。
这时执行while循环之后的语句:
printf("***ENDOFPROGRAM***\n");
输出内容:
***ENDOFPROGRAM***
由于这是main函数的最后一条语句,程序就此结束。
练习
1.编写一个程序,从键盘读入以磅为单位的重量,转换成以盎司为单位的重量,并将转换后的重量输出到屏幕。
假设重量是非负整数,在输入负整数时程序结束。
2.编写一个程序,提示用户输入整数,当用户输入负整数时,程序停止读入数据并且输出已输入的所有非负整数的和,假定至少输入一个非负整数。
1.3标识符
在写程序的时候,需要给变量、函数等取名字。
在高级语言中,标识符(Identifier)是用于命名的有
效字符序列。
在C语言中标识符必须满足下列条件:
只能以字母(从A~Z或从a~z)或下划线(
只能由字母(从A~Z或从a~z)、数字(从
不能是关键字。
关键字(keyword)是诸如int
_)作为第一个字符。
0~9)和下划线(_)组成。
或while等有特殊意义的单字或字符序列。
在附录
B中给出了关键字的完整列表。
例1.3.1
下列名称是合法的标识符:
total
total_cars
_sum
column3
TOTAL
■
除了7.4节才会提到的全局名称以外,一个标识符的至少前31个字符是有意义的。
大写字母与小写字母是有区别的,因此total和TOTAL是两个不同的标识符。
系统一般使用以下划线作为首字符的标识符。
所以,建议不要使用下划线作为自定义的标识符的第一个字符,因为这有可能使该自定义标识符与某个系统标识符产生冲突。
例1.3.2
下列名称是非法的标识符:
total$
2nd_sum
long
secondsum
TOTAL-CARS
(非法字符$)
(以数字符开头)
(关键字)
(不能含空格字符)
(非法字符-)
■
练习
1.标识符name和NAME不同吗?
解释原因。
2.允许标识符为长名称有什么优点?
请说明从练习3~练习10的每个名称是否为合法的标识符?
若名称不是合法标识符,解释原因。
3.sum_of_credits
4._type_of_car
5.while
6.SECTION_6
7.bingo-square
9initialtree
8.3_4_87
10final_#
11.下列两个标识符必然不同吗?
为什么?
chapter_3_section_xi_example_3_6
chapter_3_section_xi_example_3_3
1.4while语句
在1.2节简要介绍了
while
语句,本节将详细讨论
while
循环。
while
语句的格式如下:
while
(
expression
)
action
在执行
while语句时,首先判断表达式
expression是否为真,如图1.3所示。
C语言要求表达式
expression
由圆括号括起来。
若表达式为真,执行动作action部分,并回到循环顶部;再次判断表达式,若表达式为
真,执行动作并回到循环顶部。
重复该过程,一旦在循环顶部判断表达式为假时,就跳到紧跟在动作action
之后的语句。
在上述while循环语句的格式中,动作action部分由一条未加大括号的语句或者包含在大括
号中的一条或多条语句组成。
例1.4.1
执行如下程序片段时:
intx;
x=0;
while(x!
=2)
x=x+1;
printf("x=%d\n",x);
开始
是
否
expression
while(
expression
){
为真?
}
图1.3while语句
产生如下输出:
x=2
如下语句将x赋值为0:
x=0;
因为字符组合!
=
是关系运算符“不等于”,表达式
x!
=2
值为真,因此执行如下语句将
x加1:
x=x+1;
然后回到while循环顶部。
这时x值为1,表达式x!
=2为真,因此再次将x加1,再回到while循环顶部。
这时x值为2,至此表达式x!
=2为假;因此结束while循环。
然后执行如下语句:
printf("x=%d\n",x);
产生如下输出:
x=2■
练习
1.下列程序片段的输出结果是什么?
intx;
x=7
while(x>=0){
printf("%d\n",x);
x=x-2;
}
2.下列程序片段的输出结果是什么?
intx;
x=7
while(x>=0){
x=x-2;
printf("%d\n",x);
}
3.下列程序片段的输出结果是什么?
intx;
x=7
while(x>=0)
x=x-2;
printf("%d\n",x);
4.下列程序片段的输出结果是什么?
intx;
x=1
while(x==1){
x=x-1;
printf("%d\n",x);
}
5.下列程序片段的输出结果是什么?
intx;
x=1
while(x==1)
x=x-1;
printf("%d\n",x);
6.下列程序片段在哪里有语法错误?
while(x>0)do
x=x-1;
printf("%d",x);
1.5dowhile语句
dowhile语句类似于while语句,惟一的区别是控制循环的表达式在循环底部测试其是否为真,因此循环体总是至少被执行一次。
dowhile语句的格式如下:
do
action
while(
expression
);
在执行dowhile语句时,首先执行动作action部分,然后判断表达式expression值是否为真,若为真,
回到循环的顶部,重复该过程,如图
1.4所示。
即先执行动作,再判断表达式值。
一旦在循环底部表达式
值为假时,就跳转到紧随while(expression)之后的语句。
在上述
dowhile
循环中,动作部分由一条不加
大括号的语句或者包含在大括号中的一条或多条语句组成。
开始
do{
是
expression
否
为真
?
}while(expression)
图1.4dowhile语句
例1.5.1
dowhile循环适用于在循环底部判断条件的情况,例如,校验用户输入。
该情形下,在用户输入值以
后对输入的值进行检查。
下面的代码要求用户输入一个正数,然后对其进行有效性检查,如若输入无效,提示用户再次输入。
do{
printf("Enterapositiveinteger:
");
scanf("%d",&response);
}while(response<=0);■
练习
1.下列程序片段的打印输出结果是什么?
x=4;
do{
x=x-2;
printf("x=%d\n",x);
}while(x>=1);
2.用while循环替代dowhile循环改写例1.5.1中的程序片段。
1.6应用举例:
计算所得税
◇问题
某国有一个特别简单的征税系统。
对收入在
收30%的税,对收入大于等于6000元的人征收
程序依次读取收入,直到用户输入文件结束标志(
分,使得输出为整数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 导论