c语言基础知识

更新时间:2024-06-30 12:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

“每天晚上下了班就和放假一样的心情” 这一点很重要

第1章 程序设计基本概念

1.1 程序和程序设计 1.1.1 C程序

连续执行的一条条指令的集合称为“程序”。计算机并不能直接识别由高级语言编写的程序,它只能接受和处理由0和1的代码构成的二进制指令或数据。这种形式的指令称为“机器语言”。

每条C语句,经过编译(Compile)最终都将转换成二进制的机器指令。由C语言构成的指令序列称为C源程序。C源程序经过C编译程序编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件),然后由“连接程序”(Link),把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。在操作系统环境下,只需点击或输入此文件的名字(而不必输入后缀.EXE),该可执行文件就可运行。 1.1.2 程序设计

简单的程序设计一般包含以下几个部分:确定数据结构、确定算法、编码、在计算机上调试程序、整理并写出文档资料。 ◆ 【例题分析】

(2007.4试题)下列叙述中错误的是(D) A)计算机不能直接执行用C语言编写的源程序

B)C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件 C)后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件 D)后缀为.obj和.exe的二进制文件都可以直接运行 (2009.9试题)以下叙述中正确的是(D) A)程序设计的任务就是编写程序代码并上机调试 B)程序设计的任务就是确定所用数据结构 C)程序设计的任务就是确定所用算法 D)以上三种说法都不完整 1.2算法

学习计算机程序设计语言的目的,是要用语言作为工具,设计出可供计算机运行的程序。有了一个好的算法,就可以用任何一种计算机高级语言把算法转换为程序(编写程序)。算法是指为解决某个特定问题而采取的确定且有限的步骤。一个算法应当具有以下五个特性:有穷性、确定性、可行性、有零个或多个输入、有一个或多个输出。

算法可以用各种描述方法来进行描述,最常用的是伪代码、流程图和N-S流程图。 1.3 结构化程序设计和模块结构

1 / 26

1.3.1 结构化程序

结构化程序由三种基本结构组成:顺序结构、选择结构、循环结构。 1.3.2 模块化结构

当计算机在处理较复杂的任务时常常把这个复杂的任务分解为若干个子任务,每个子任务又分成很多个小子任务,每个小子任务只完成一项简单的功能。在程序设计时,用一个个小模块来实现这些功能,每个程序设计人员分别完成一个或多个小模块。我们称这样的程序设计方法为“模块化”的方法,由一个个功能模块构成的程序结构为模块化结构。 在进行程序设计时,首先应当集中考虑主程序中的算法,写出主程序后再动手逐步完成子程序的调用。对于这些子程序也可用调试主程序的同样方法逐步完成其下一层子程序的调用。这就是自顶向下、逐步细化、模块化的程序设计方法。

c语言是一种结构化程序设计语言。它提供了三种基本结构的语句;提供了定义“函数”的功能,在c语言中没有子程序的概念,它提供的函数可以完成子程序的所有功能;C语言允许对函数单独进行编译,从而可以实现模块化。另外,c语言还提供了丰富的数据类型。这些都为结构化程序设计提供了有力的工具。 四、第一章补充知识点

1、C语言由函数组成,有且仅有一个主函数--main(),一个程序总是从主函数开始执行; 2、C语言的语句由“;”结束,书写格式自由,一行可写多个语句,一个语句可分多行书写; 3、C程序是大小写敏感的(严格区分字母大小写); ◆ 【例题分析】

(2010.3试题)以下叙述正确的是(B) A)C语言程序是由过程和函数组成的

B)C语言函数可以嵌套调用的,例如:fun(fun(x)) C)C语言函数不可以单独编译

D)C语言中除了main函数,其他函数不可作为单独文件形式存在 (习题)以下说法中正确的是(C)

A)C语言程序总是从第一个定义的函数开始执行

B)在C语言程序中,要调用的函数必须在main()函数中定义 C)C语言程序总是从main()函数开始执行

D)C语言程序中的main()函数必须放在程序的开始部分

4、C程序的文件扩展名必须是.c; 5、C语言的两种注释方式://行尾注释或/*块注释*/; 6、使用输入/出库函数时需在预处理命令中包含stdio.h头文件; 7、要求熟记本章中出现的几种定界符:<>、\、;、()、\\n、//等; ◆ 【例题分析】

2 / 26

(2007.9试题)C语言源程序名的后缀是(B) A) .exe B) .C C) .obj D) .cp

(2008.4试题)以下叙述中正确的是(C)

A)C程序中的注释只能出现在程序的开始位置和语句的后面 B)C程序书写格式严格,要求一行内只能写一个语句 C)C程序书写格式自由,一个语句可以写在多行上 D)用C语言编写的程序只能放在一个程序文件中

第2章 C程序设计的初步知识

2.1 简单C语言程序的构成和格式 例2.1 求矩形的面积。 程序如下: #include Main() {

double a,b,area;

a=1.2;/*将矩形的两条边长分别赋给a和b*/ b=3.6;

area=a*b;//计算机矩形的面积并存储到变量area中b

printf(“a=%f,b=%f,area=%f\n”,a,b,area);/*输出矩形的两条边长和面积*/ }

2.2标识符、常量和变量 2.2.1标识符

在C语言中,有许多符号的命名,如变量名、函数名、数组名等,都必须遵守一定的规则,按此规则命名的符号称为标识符。合法标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须为字母或下划线。在C语言程序中,凡是要求标识符的地方都必须按此规则命名。以下都是合法的标识符:area、PI、_ini、a_array、s1234、Pl01P。以下都是非法的标识符:456P、cade-Y、W.W、a&b。

C语言的标识符可以分为以下三类:关键字、预定义标识符、用户标识符。 2.2.2 常量

所谓常量是指在程序运行过程中,其值不能被改变的量。在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。整型常量还可以进一步分为短整型常量、长整型常量等。整型常量和实型常量又称数值型常量,它们有正值和负值的区分。基本整型常量只用

3 / 26

数字表示,不带小数点,例如12、-1、0等。实型常量必须用带小数点的数表示,例如3.14159、-2.71828、0.0等。'A'和'd '则是字符型常量,而”NCRE”和”Beijing”是字符串常量。 2.2.3 符号常量

在C语言程序中,可以用一个符号名来代表一个常量,称为符号常量。这个符号名必须在程序中进行特别的”指定”,并符合标识符的命名规则。 例2.2计算圆面积。

#define PI 3.14159/*定义符号名Pl为3.14159*/ main() {

double r,s;r=5.0: s=PI*r*r:

printf(“s=%f\n”,s); }

2.2.4变量

所谓变量是指在程序运行过程中其值可以改变的量。程序中用到的所有变量都必须有一个名字作为标识,变量的名字由用户定义,它必须符合标识符的命名规则。如例2.1中的a、b和 area就是由用户定义的变量名。

一个变量实质上是代表了内存中的某个存储单元。在程序中,变量a就是指用a命名的某个存储单元,用户对变量a进行的操作就是对该存储单元进行的操作;给变量a赋值,实质上就是把数据存入该变量所代表的存储单元中。

C语言规定,程序中所有变量都必须先定义后使用。对变量的定义通常放在函数体内的前部,但也可以放在函数的外部或复合语句的开头。

像常量一样,变量也有整型变量、实型变量、字符型变量等不同类型。在定义变量的同时要说明其类型,系统在编译时就能根据其类型为其分配相应的存储单元。 ◆ 【例题分析】

(2010年3月)以下C语言用户标示符中,不合法的是(D) A)_1B)AaBcC)a_b D)a-b

(2009年9月)以下选项中,能用作用户标识符的是(C) A)voidB)8_8C)_0_ D)unsigned

(2009年3月)以下选项中合法的标识符是(C) A)1_1 B)1-1 C)_11 D)1_ _。 2.3 整型数据

2.3.1整型常量

整型常量可以用十进制、八进制和十六进制等形式表示。

4 / 26

八进制数,如010、011、016等。十六进制数用数字0和字母X(或大写字母X)开头,如Ox10、OXde、Oxf等都是合法的十六进制数。十六进制数中的字母a、b、e、d、e、f既可以用小写也可以用大写。只有十进制数可以是负数,而八进制和十六进制数只能是正整数。 在VC 6.0中可以在长整型常量的后面加一个字母l(L的小写)或L,例如:l23L、3451、OL、123456L等,这些常量在内存中占4个字节。无符号整数在数的末尾应该加上字母后缀u或U,若是长整型无符号整型常量,则可以加后缀lu或LU。 2.3.2整型变量

整型变量可以分为基本型(int)、短整型(short int)、长整型(int或long int)、无符号型(unsigned)四种。不同的编译系统为int变量开辟的内存单元大小不同。VC6.0为int 变量开辟4个字节(32个二进制位)的内存单元,允许存放的数值范围是:-2147483648~2147483647。整型的变量只能存放整型数值。

若不指定变量为无符号型,则变量隐含为有符号型(signed)。

短整型无符号常量的取值应在0~65535范围内,长整型无符号常量的取值在0~4294967295的范围内。注意:无符号常量不能表示成小于0的负数,例如:-200U是不合法的。

2.3.3整数在内存中的存储形式 1、位、字节、字长

计算机中,内存储器的最小存储单位称为“位(bit)”。由于只能存放0或1,因此称为二进制位。大多数计算机把8个二进制位组成一个“字节(byte)”,并给每个字节分配一个地址。若干字节组成一个“字(word)”,用一个“字”来存放一条机器指令或一个数据。一个字含多少个字节随机器的不同而不同,如32位机器、64位机器。 2、有符号数

通常把一个字节中的最右边一位称为最低位,最左边一位称为最高位。对于一个有符号整数,其中最高位(最左边的一位)用来存放整数的符号,称为符号位。若是正整数,最高位放置0;若是负整数,最高位放置1。

在内存中正整数用“原码”形式存放,负整数是以“补码”形式存放的。 例如,求10000101(十进制数-5)的补码,步骤如下:

(1)求原码的反码。把原码除符号位之外的二进制码按位取反,即把1变成0,0变成1,即得到该原码的反码。例如10000101的反码为11111010。

(2)把所得的反码加1,即得到原码的补码。因此11111010加1得11111011,这就是-5在内存中的二进制码。若用两个字节表示,即为:1111111111111011 3、无符号数

用两个字节存放一个整数时,若说明为无符号整数,则最高位不再用来存放整数的符号,16个二进制位全部用来存放整数,因此无符号整数不可能是负数。这时,若内存中存放的16个二进制位全部为1,则它所代表的整数就不再是-1,而是65535。 (2009年3月)若函数中有定义语句:int k;,则(B) A)系统将自动给k赋初值0 B)这时k中的值无定义 C)系统将自动给k赋初值-1 D)这时k中无任何值 (2008年9月)C源程序中不能表示的数制是(A)

A)二进制 B)八进制 C)十进制 D)十六进制 (习题)以下选项中正确的整型常量是(B) A)12.B)-20C)1,000 D)4 5 6 2.4 实型数据

2.4.1 实型常量

5 / 26

实型常量又称实数或浮点数。在C语言中可以用两种形式表示一个实型常量。在内存中,实数一律是以指数形式存放的。 1、小数形式

小数形式是由数字和小数点组成的一种实数表示形式,例如1.123、.123、123.、0.0等都是合法的实型常量。注意:小数形式表示的实型常量必须要有小数点。 2、指数形式 以“e”或“E”后跟一个整数来表示以10为底的幂数。2.3026可以表示为0.23026E1、2.3026e0、23.026e-1。C语言的语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、.5e3.6、.e3、e等都是非法的指数形式。注意:在字母e或E的前后以及数字之间不得插入空格。 2.4.2实型变量

C语言中实型变量分为单精度型和双精度型两种,分别用类型名float和double进行定义。 在一般计算机系统中,为float类型的变量分配4个字节的存储单元,为double类型的变量分配8个字节的存储单元。实型的变量只能存放实型数,不能用整型变量存放一个实数,也不能用实型变量存放一个整数。

在VC 6.0中单精度实数(float类型)的数值范围约在-1038~1038之间,并提供7位有效数字位;绝对值小于l0-38的数被处理成零值。双精度实数(double类型)的数值范围约在-10308~10308之问,并提供l5~16位有效数字位,具体精确到多少位与机器有关;绝对值小于l0-308的数被处理成零值。因此double型变量中存放的数据要比float型变量中存放的数据精确得多。注意,在VC 6.0中,所有的float类型数据在运算中都自动转换成double型数据。

注意:在计算机中可以精确地存放一个整数,不会出现误差,但实型数的数值范围较整型大,还往往存在误差。 ◆ 【例题分析】

(2009年3月)以下选项中,能用作数据常量的是(D) A)o115 B) 0118C) 1.5e1.5D)115L (习题)以下选项中正确的实型常量是(B) A)0B)3.1415C)0.329×102 D).872

(习题)以下选项中不正确的实型常量是(B) A)2.607E-1B)0.8103 e 2C)-77.77 D)456e-2 2.5 算术表达式

2.5.1基本的算术运算符

在C语言中,基本的算术运算符是:+、-、*、/、%,分别为加、减、乘、除、求余运算符。这些运算符需要两个运算对象,称为双目运算符。除求余运算符%外,运算对象可以是整型,也可以是实型。如l+2、1.2*3.2。 求余运算符的运算对象只能是整型。当运算数为负数时,所得结果的符号随机器的不同而不同。

“+”和“-”也可用作单目运算符,运算符必须出现在运算数的左边。 说明:

(1)如果双目运算符两边运算数的类型一致,则所得结果的类型与运算数的类型一致。例如:1.0/2.0,其运算结果为0.5;1/2,其运算结果为0。

(2)如果双目运算符两边运算数的类型不一致,系统将自动进行类型转换,使运算符两边的类型达到一致后,再进行运算。在进行双目运算时,若运算符两边的运算数类型不一致,其类型转换规律如下表。

6 / 26

(3)在C语言中,所有实型数的运算均以双精度方式进行。若是单精度数,则在尾数部分添0,使之转化为双精度数。

2.5.2运算符的优先级、结合性和算术表达式

在C语言中,常量、变量、函数调用以及按C语言语法规则用运算符把运算数连起来的式子都是合法的表达式。凡是表达式都有一个值,即运算结果。

例如:表达式(5+1)/2的运算结果是3,圆括号的优先级高于除号;表达式5+1/2的运算结果是5,除号的优先级高于加号;表达式5*-2的运算结果是-10,单目运算符“-”的优先级高于乘号,这个表达式与5*(-2)等价。

用算术运算符和圆括号将运算数(或称操作数)连接起来的、符合C语言语法的表达式称为算术表达式。

算术表达式中,运算对象可以是常量、变量和函数等。例如:2+sqrt(c)*b. 2.5.3 强制类型转换表达式

强制类型转换表达式的形式如下:(类型名)(表达式)

(类型名)称为强制类型转换运算符,利用强制类型转换运算符可以将一个表达式的值转换成指定的类型,这种转换是根据人为要求进行的。例如:表达式(int)3.234把3.234转换成整数3;表达式(double)(10%3)把10%3所得结果l转换成双精度数。 ◆ 【例题分析】

(2009年9月)表达式:(int)((double)9/2)-(9)%2的值是(B) A)0 B)3 C)4 D)5

(2008年9月)以下不能正确表示代数式2ab/cd的C语言表达式是(D) A)2*a*b/c/d B)a*b/c/d*2 C)a/c/d*b*2 D)2*a*b/c*d

(2009年9月)若有语句double x=17;int y;,当执行y=(int)(x/5)%2;之后y的值为 【7】 。(答案:1)

(2009年3月)表达式(int)((double)(5/2)+2.5)的值是【6】。(答案:4) 2.6 赋值表达式

2.6.1赋值运算符和赋值表达式

在c语言中,赋值号“=”是一个运算符,称为赋值运算符。由赋值运算符组成的表达式称为赋值表达式,其形式如下:变量名=表达式

赋值号的左边必须是一个代表某一存储单元的变量名,对于初学者来说,只要记住赋值号左边必须是变量名即可。赋值号的右边必须是C语言中合法的表达式。赋值运算的功能是先求出右边表达式的值,然后把此值赋给赋值号左边的变量,确切地说,是把数据存入以该变量为标识的存储单元中去。

例如,a和b都被定义成int类型变量: a=10;/*把常量10赋给变量a*/

b=a; /*把a中的值赋给变量b,a中的值不变*/ 在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋的那个数据。 2.6.2复合赋值表达式

7 / 26

在赋值运算符之前加上其他运算符可以构成复合赋值运算符。c语言规定可以使用10种复合赋值运算符,其中与算术运算有关的复合赋值运算符有:+=、-=、*=、/=、%=(注意:两个符号之间不可以有空格)。复合赋值运算符的优先级与赋值运算符的优先级相同。表达式n+=1的运算规则等价于n=n+1,表达式n*=m+3的运算规则等价于n=n*(m+3),因为运算符“+”的优先级高于复合赋值运算“* =”。其他以此类推。

例,已有变量a,其值为9,计算表达式 a+=a-=a+a的值。 2.6.3 赋值运算中的类型转换 在赋值运算中,只有在赋值号右侧表达式的类型与左侧变量类型完全一致时,赋值操作才能进行。如果赋值运算符两侧的数据类型不一致,在赋值前,系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换,也可以用强制类型转换的方式人为地进行转换后将值赋给赋值号左边的变量。这种转换仅限于数值数据之问,通常称为“赋值兼容”。对于另外一些数据,例如后面将要讨论的地址值就不能赋给一般的变量,称为“赋值不兼容”。 ◆ 【例题分析】

(2009年3月)设有定义:int x=2;以下表达式中,值不为6的是(D) A)x*=x+1 B)x++,2*xC)x*=(1+x)D)2*x,x+=2

(2010年3月) 若有定义语句:int x=10;,则表达式x-=x+x的值为(B) A)-20 B)-10 C)0 D)10

2.7 自加、自减运算符和逗号运算符

2.7.1自加运算符“++”和自减运算符“--” (1)自增/减运算符“++/--”的运算结果是使运算对象的值增1或减l。如i++,相当于i=i+1;i--,相当于i=i-1。因此,自加或自减运算本身也是一种赋值运算。

(2)运算符“++”和“--”是单目运算符,运算对象可以是整型变量也可以是实型变量,但不能是常量或表达式,因为不能给常量或表达式赋值。因此,如++3、(i+j)--等都是不合法的。

(3)用自加或自减运算符构成表达式时,既可以前缀形式出现,也可以后缀形式出现。例如:++i、--i、i++、i--等都是合法的表达式。无论是作为前缀运算符还是作为后缀运算符,对于变量本身来说自增l或自减1都具有相同的效果,但作为表达式来说却有着不同的值。例如,若变量i为int类型,且已有值为5。若表达式为++i,则先进行i增1运算,i的值为6,表达式的值也为6;若表达式为i++,则表达式先取i的值为5,然后i进行增1运算,使i中的值为6。

(4)运算符“++”和“--”的结合方向是“自右至左”。例如有一表达式-i++,其中i的原值为3。由于负号运算符与自加运算符的优先级相同,结合方向是“自右至左”,即相当于对表达式-(i++)进行运算,此时自加运算符“++”为后缀运算符,(i++)的值为3,因此-(i++)的值为-3,然后i自增为4。

(5)不要在一个表达式中对同一个变量进行多次诸如i++或++i等运算,例如写成: i++*++i+i--*--i,这种表达式不仅可读性差,而且不同的编译系统对这样的表达式将做不同的解释,进行不同的处理,因而所得结果也各不相同。 2.7.2逗号运算符和逗号表达式 “,”是c语言提供的一种特殊运算符,用逗号将表达式连接起来的式子称为逗号表达式。逗号表达式的一般形式为:表达式1,表达式2,??,表达式n 说明:

(1)逗号运算符的结合性为从左到右,因此逗号表达式将从左到右进行运算。即,先计算表达式1,然后计算表达式2,依次进行,最后计算表达式n。最后一个表达式的值就是此逗号表达式的值。例如:(i=3,i++,++i,i+5)这个逗号表达式的值是10,i 的值为5。

8 / 26

(2)在所有运算符中,逗号运算符的优先级最低。 第二章能力点

1、掌握C的数据类型、常量、变量及表达式,并运用于C程序设计的能力; 2、在Visaul C++ 6.0中调试表达式的能力。

第3章 顺序结构

在程序中若按语句出现的顺序逐条执行,由这样的语句构成的程序结构称为顺序结构。 3.1 赋值语句

在赋值表达式尾部加上一个“;”号,就构成了赋值语句,也称表达式语句。例如a=b+c是赋值表达式,a=b+c; 则是赋值语句。i++;、--i;、a=b=c、a=b,b=c;等也是赋值语句。要注意,不要把变量定义时的赋初值和赋值语句混为一谈。

C语言中可由形式多样的赋值表达式构成赋值语句,用法灵活,因此读者首先应当掌握好赋值表达式的运算规律才能写出正确的赋值语句。 3.2数据输出

把数据从计算机内部送到计算机外部设备上的操作称为“输出”。例如把计算机运算结果显示在屏幕上或打印在纸上,或者送到磁盘上保存起来。从计算机外部设备将数据送入计算机内部的操作称为“输入”。

C语言本身并没有提供输入输出语句,但可以通过调用标准库函数中提供的输入和输出函数来实现输入和输出。C语言提供了丰富的用于输入和输出的库函数。在VC++ 6.0环境下,在调用输入和输出的库函数之前要求在源程序中出现包含头文件stdio.h的命令行: #include

3.2.1 printf函数的一般调用形式

printf函数是C语言提供的标准输出函数,用来在终端设备上按指定格式进行输出。 printf函数的调用形式如下:

printf(格式控制,输出项1,输出项2,?)

格式控制是字符串形式。在printf函数调用之后加上“;”,则构成输出语句。 例如:printf(“a=%d,b=%d”,a,b);

以上输出语句中,printf是函数名,用双引号括起来的字符串部分“a=%d,b=%d”是输出格式控制,决定了输出数据的内容和格式。a,b称为输出项,是printf函数的实参。 printf函数中格式控制的作用是: 1.给输出项提供输出格式说明

输出格式说明的作用是将要输出的数据按照指定的格式输出。格式说明由“%”符号和紧跟在其后的格式描述字符组成。当输出项为int类型时,用d作为格式描述字符,其形式为%d;当输出项为float或double类型时,用f或e作为格式描述字符,其形式为%f或%e(对于double类型也可用%lf或%le)。

9 / 26

2.提供需要原样输出的文字或字符

除了格式转换说明外,字符串中的其他字符(包括空格)将按原样输出。这样使得输出结果具有可读性。

printf的各输出项之间用逗号隔开(函数的各个参数之间必须用逗号隔开)。输出项可以是任意合法的常量、变量或表达式。printf可以没有输出项,此时函数的调用形式为printf(格式控制),输出结果就是格式控制中的字符串。

例如:printf(“OK!”);将输出字符串:OK!。 3.2.2 printf函数中常用的格式说明

格式控制中,每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之间可以根据需要插入“宽度说明”、左对齐符号“-”、前导零符号“0”等。 1.格式字符 %后允许使用的格式字符和它们的功能如下表所示。在某些系统中,可能不允许使用大写字母的格式字符,因此为了使程序具有通用性,写程序时应尽量不用大写字母的格式字符。 格式字符 说 明 c 输出一个字符 输出带符号的十进制整型数。%ld为长整型(16位编译器上必须使用),%hd为短整d或i 型,%i64d为64位长整数(VC++4.0以上版本输出_int64类型的整数) 以八进制格式输出整型数。%o不带先导0,例如十进制数15用%o输出为17;%#o加o 先导0,例如十进制数15用%#o输出为017 以十六进制格式输出整型数。不带先导0x或0X,例如十进制数2622用%x数据格式x 输出为a3e,用%X数据格式输出为A3E;%#x输出带先导0x或0X的十六进制数,例如十进制数2622用%#x数据格式输出为0xa3e,而用%#X数据格式输出为0XA3E u f 以无符号十进制形式输出整型数 以带小数点的数学形式输出浮点数(单精度和双精度数) 以指数形式输出浮点数(单精度和双精度数),格式是:[-]m.dddddde±XXX或[-]m.ddddddE±xxx。小数位数(d的个数)由输出精度决定,隐含的精度是6。若指e 定的精度为0,则包括小数点在内的小数部分都不输出。XXX为指数,保持3位,不足补0。若指数为0,输出指数是000 g s p % 由系统决定采用%f格式还是采用%e(或%E)格式输出,以使输出宽度最小 输出一个字符串,直到遇到”\\0”。若字符串长度超过指定的精度则输出完整字符串 输出变量的内存地址 也就是%%形式,输出一个% 2.长度修饰符

在%和格式字符之间,可以加入长度修饰符,以保证数据输出格式的正确和对齐。对于长整型数(long)应该加l,即%ld;对于短整型数(short)可以加h,即%hd。

10 / 26

{语句l 语句2

??语句n }

用一对花括号把若干语句括起来构成一个语句组。一个复合语句在语法上视为一条语句,在一对花括号内的语句数量不限。在复合语句中,可以定义本复合语句中的局部变量。 3.4.2 空语句

c程序中的所有语句都必须由一个分号“;”作为结束。如果只有一个分号,这个分号也是一条语句,称为“空语句”,程序执行时不产生任何动作。程序设计中有时需要加一个空语句来表示存在一条语句,但随意加分号也会导致逻辑上的错误,而且这种错误十分隐蔽,编译器也不会提示逻辑错误,初学者一定要小心,需要慎用。 第三章能力点

1、熟练运用printf、scanf、putchar、getchar进行输入/出格式控制的能力; 2、顺序结构程序设计的能力;

3、在VC++6.0环境下进行顺序结构程序调试的能力。

第4章 选择结构

C语言提供了可以进行逻辑判断的若干选择语句,由这些选择语句可构成程序中的选择结构,通常又称为分支结构,它将根据逻辑判断的结果决定程序的不同流程。

选择结构是结构化程序设计的三种基本结构之一。本章将详细介绍如何在C程序中实现选择结构。

4.1关系运算和逻辑运算 4.1.1 C语言的逻辑值

关系表达式和逻辑表达式的运算结果都会得到一个逻辑值。逻辑值只有两个,分别用“真”和“假”来表示。在C语言中,没有专门的“逻辑值”,而是用非0表示“真”,用0表示“假”。

4.1.2 关系运算符和关系表达式

关系运算实际上是“比较运算”,即进行两个数的比较,判断比较的结果是否符合指定的条件。

1、C语言的关系运算符

C言提供了6种关系运算符,它们分别是:

(1) < (小于) (2) <= (小于或等于) (3) > (大于) (4) >= (大于或等于) (5) == (等于) (6) != (不等于)

注意:由两个字符组成的运算符之间不允许有空格,如:<=就不能写成< =。关系运算符是双目运算符,具有自左至右的结合性。

以上运算符中,前四种关系运算符(<、<=、>、>=)的优先级别相同,后两种(==、!=)优先级相同,且前四种的优先级高于后两种。关系运算符、算术运算符和赋值运算符之间的优先级次序是:算术运算符的优先级别最高,关系运算符次之,赋值运算符的优先级别最低。

16 / 26

2、关系表达式及关系表达式的值

由关系运算符构成的表达式,称为关系表达式。关系运算符两边的运算对象可以是C语言中任意合法的表达式。例如,a>=b、(a=3)>(b=4)、a>c==c等都是合法的关系表达式。 关系运算的值为“逻辑值”,只有两种可能:整数0或者整数1。例如,若变量a中的值为10,变量b中的值为6时,表达式a>=b为“真”,其值为1;若a中的值为10,b中的值为l6时,表达式a>=b为“假”,其值为0。

当关系运算符两边值的类型不一致时,例如一边是整型,另一边是浮点型,则系统将自动把整型数转换为浮点数,然后进行比较,其类型转换规则与附录5中所列双目算术运算中的类型转换规则相同。若x和y都是浮点数,应当避免使用x==y这样的关系表达式,因为通常存放在内存中的浮点数是有误差的,因此不可能精确相等,这将导致关系表达式x==y的值总是为0。

4.1.3 逻辑运算符和逻辑表达式 1、C语言的逻辑运算符

C语言提供了三种逻辑运算符,分别是:

(1)&&逻辑“与” (2)||逻辑“或” (3)!逻辑“非”

其中,运算符&&和||为双目运算符,运算符!为单目运算符,出现在运算对象的左边。逻辑运算符具有自左至右的结合性。

以上运算符的优先级次序是:!(逻辑“非”)级别最高,&&(逻辑“与”)次之,||(逻辑“或”)最低。逻辑运算符与赋值运算符、算术运算符、关系运算符之间从高到低的运算优先次序是:!(逻辑“非”)、算术运算符、关系运算符、&&(逻辑“与”)、||(逻辑“或”)、赋值运算符。

2、逻辑表达式和逻辑表达式的值

由逻辑运算符和运算对象组成的表达式称为逻辑表达式。逻辑运算的对象可以是C语言中任意合法的表达式。逻辑表达式的运算结果或者为1(“真”),或者为0(“假”)。由逻辑运算符构成的逻辑表达式,其运算规则如下所示。 a 非0 非0 O O b 非0 O 非0 0 !a O 0 1 1 !b 0 1 O 1 a&&b 1 O O 0 a||b 1 l 1 0 注:其中a和b为任意合法表达式。 在数学上关系式0

因此无论x取什么值,结果总为1。C语言的正确表达式应为x>0 && x<10。 在C语言中,由&&或||构成的逻辑表达式,在特定的情况下会产生“短路”

17 / 26

现象。例如,对以下表达式:a++ && b++,若a的值为0,表达式首先去求a++的值,由于表达式a++的值为0,系统完全可以确定逻辑表达式的运算结果总是为0,因此将跳过b++不再对它进行求值。在这种情况下,a的值将自增1,由0变成1,而b的值将不变。若a的值不为0,则系统不能仅根据表达式a++的值来确定逻辑表达式的运算结果,因此必然要再对运算符&&右边的表达式b++进行求值,这时将进行b++的运算,使b的值改变。又例如以下逻辑表达式:a++||b++,若a的值为1,表达式首先去求a++的值,由于表达式a++的什为1,无论表达式b++为何值,系统安全可以确定逻辑表达式的运算结果总是为1,因此也将跳过b++不再对它进行求什。在这种情况下,a的值将自增1,b的值将不变。若a的值为0,则系统不能仅根据表达式a++的值来确定逻辑表达式的运算结果,因此必然要再对运算符||右边的表达式b++进行求值,这时将进行b++的运算,运算结果不仅使a的值改变,也改变了b的值。

4.2 if语句和用if语句构成的选择结构 4.2.1 if语句

C语言的if语句有以下两种基本形式:

(1)if(表达式)语句 /*不含else子句的if语句*/ (2)if(表达式)语句l /*含else子句的if语句*/ else语句2

1、不含else子句的if语句 (1)语句形式 if (表达式) 语句

其中,if是C语言的关键字,在其后一对圆括号中的表达式可以是C语言中任意合法的表达式。表达式之后只能是一条语句,称为if子句。如果该子句中含有多个语句(两个以上),则必须使用复合语句,即用花括号把一组语句括起来,因为复合语句可以看成是“一条语句”。 (2)if语句的执行过程

执行if语句时,首先计算紧跟在if后面一对圆括号中的表达式的值。如果表达式的值为非零(“真”),则执行其后的if子句,然后去执行if语句后的下一条语句;如果表达式的值为零(“假”),则跳过if子句,直接执行if语句后的下一条语句。 2、含else子句的if语句 (1)语句形式 if (表达式) 语句1 else 语句2

在这里,if和else是C语言的关键字,“语句1”称为if子句,“语句2”称为else 子句,这些子句只允许为一条语句,若需要多条语句时,则应该使用复合语句{}。

注意:else 不是一条独立的语句,它只是if 语句的一部分,不允许有这样的语句: else printf(“***”);

在程序中 必须与if配对,共同组成一条 if-else 语句。 (2)if-else语句的执行过程 执行if-else语句时,首先计算紧跟在if后面一对圆括号内表达式的值。如果表达式的值为非0,执行if子句,然后跳过else子句,去执行if语句之后的下一条语句;如果表达式的值为0,跳过if子句,去执行else子句,执行完之后接着去执行if语句之后的下一条语句。 3、关于if语句的说明

(1)if后面圆括号中的表达式,可以是任意合法的C语言表达式(如:逻辑表达式、关系表达式、算术表达式、赋值表达式等),也可以是任意类型的数据(如:整型、实型、字符型、

18 / 26

指针型等)。

(2)无论是否有else子句,if子句中如果只有一条语句,则此语句后的分号不能省略。如:if (x!=0) printf(\%f\,x); 4.2.2嵌套的if语句

if子句和else子句中可以是任意合法的c语句,因此当然也可以是if语句,通常称此为嵌套的if语句。内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。 1、在if子句中嵌套

具有else子句的if语句形式如下: if(表达式1)

if (表达式2) 语句l else 语句2 else 语句3

表达式l的值为非0时,执行内嵌的if-else语句;表达式1的值为0时,执行语句3。 2、在if子句中嵌套不含else子句的if语句 语句形式如下: if(表达式1)

{if(表达式2) 语句1} else 语句2

注意:在if子句中的一对花括号不可缺少。因为C语言的语法规定:else子句总是与前面最近的不带else的if相结合,与书写格式无关。 3、在else子句中嵌套if语句 语句形式如下:

(1)内嵌的if语句带有else: if (表达式1) 语句1 else if (表达式2) 语句2 else 语句3

(2)内嵌的if语句不带else: if (表达式1)语句1 else if (表达式2)语句2

由以上两种语句形式可以看到,内嵌在else子句中的if语句无论是否有else子句,在语法上都不会引起误会,因此建议读者在设计嵌套的if语句时,尽量把内嵌的if语句嵌在else子句中。

C语言程序有比较自由的书写格式,但是过于“自由”的程序书写格式往往使人们很难读懂,因此要求按层缩进的书写格式来写自己的程序。 不断在else子句中嵌套if语句可形成多层嵌套。如: if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 ??

else if (表达式n) 语句n else 语句n+1

从上向下逐一对if后的表达式进行检测。当某一个表达式的值为非0时,就执行与此有关子句中的语句,阶梯形中的其余部分不执行,直接越过去。如果所有表达式的值都为0,则执行最后的else子句,此时如果程序中最内层的if语句没有else子句,即没有最后的那

19 / 26

个else子句,那么将不进行任何操作。

4.3 条件表达式构成的选择结构

前面介绍的是使用C语言中的if语句来构成程序中的选择结构。C语言另外还提供了一个特殊的运算符——条件运算符,由此构成的表达式也可以形成简单的选择结构,这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,使得可以根据不同的条件使用不同的数据参与运算。 1.条件运算符

条件运算符由两个运算符组成,它们是:?:。这是C语言提供的唯一的三目运算符,即要求有三个运算对象。

2.由条件运算符构成的条件表达式 条件表达式的形式如下:

表达式1?表达式2:表达式3 3.条件表达式的运算功能

当“表达式1”的值为非零时,求出“表达式2”的值,此时“表达式2”的值就是整个条件表达式的值;当“表达式1”的值为零时,则求“表达式3”的值,这时便把“表达式3”的值作为整个条件表达式的值。 4.条件运算符的优先级

条件运算符优先于赋值运算符,但低于关系运算符和算术运算符。 例如:

(1)y=x>10?100:200

(2)printf(“abs(x)=%d\\n”,x<0?(-1)*x:x)

4.4 switch语句以及用switch 语句和break 语句构成的选择结构 4.4.1 switch 语句

switch语句形式如下: switch (表达式)

{ case常量表达式1:语句1 case常量表达式2:语句2 case常量表达式n:语句n default:语句n+1 } 说明:

(1)switch是C语言的关键字,switch后面用花括号括起来的部分称为switch语句体。 (2)紧跟在switch后一对圆括号中的表达式可以是整型表达式及后面将要学习的字符型表达式等。表达式两边的一对括号不能省略。

(3)case也是关键字,与其后面的常量表达式合称case语句标号。常量表达式的类型必须与swicth后圆括号中的表达式类型相同,各case语句标号的值应该互不相同。

(4)default也是关键字,起标号的作用,代表所有case标号之外的那些标号。default标号可以出现在语句体中任何标号位置上。在switch语句体中也可以没有default标号。

(5)case语句标号后的语句1,语句2等,可以是一条语句,也可以是若干语句。 (6)必要时,case语句标号后的语句可以省略不写。

(7)在关键字case和常量表达式之间一定要有空格,例如case 10:不能写成casel0:。 4.4.2 switch语句的执行过程

当执行swicth语句时,首先计算紧跟其后一对括号中的表达式的值,然后在switch语句体内寻找与该值吻合的case标号。如果有与该值相等的标号,则执行该标号后开始的各语句,包括在其后的所有case和default中的语句,直到switch语句体结束;如果没有与该

20 / 26

值相等的标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束;如果没有与该值相等的标号,同时又没有default标号,则跳过switch语句体,去执行switch语句之后的语句。

4.4.3 在switch语句体中使用break语句

break为C语言关键字,break语句又称间断语句。可以将break语句放在case标号之后的任何位置,通常是在case之后的语句最后加上break语句。每当执行到break语句时,立即跳出 switch语句体。switch语句通常总是和break语句联合使用,使得switch语句真正起到分支的作用。

现用break语句修改例4.6的程序。 #include main() {int g;

printf(“Enter a mark:”);

scanf(“%d”,&g);/* g中存放学生的成绩*/ printf(“g=%d:”,g);

switch (g /10) //此处表达式可能取case语句中表达式的值 { case 10:

case 9:printf(\\n\ case 8:printf(\\n\ case 7:printf(\\n\ case 6:printf(\\n\ default:printf(\\n\ 程序执行过程如下:

(1)当给g输入100时,switch中的表达式:g/10的值为10。因此选择case 10 分支,因为没有遇到 break语句,所以继续执行case 9 分支,在输出:g=100:A之后,遇 break语句,执行 break语句,退出 switch语句体。由此可见,成绩90到100分,执行的是同一分支。 (2)当输入成绩45时,switch中的表达式的值为4,将选择分支default,在输出:g=45:E之后结束switch语句。

(3)当输入成绩为85时,switch中的表达式的值为8,因此选择case 8分支,在输出:9=85:B之后,执行break语句,退出switch语句体。

4.5 语句标号和goto语句 4.5.1语句标号

在C语言中,语句标号不必特意加以定义,标号可以是任意合法的标识符,当在标识符后面加一个冒号,如:flag1:、stop0:,该标识符就成了一个语句标号。注意:在C语言中,语句标号必须是标识符,因此不能简单地使用10:、15:等形式。标号可以和变量同名。 通常,标号用作goto语句的转向目标。如:goto stop;

在C语言中,可以在任何语句前加上语句标号。例如:stop:printf(“END\n”); 4.5.2 goto语句

goto语句称为无条件转向语句,goto语句的一般形式如下:goto 语句标号; goto语句的作用是把程序的执行转向语句标号所在的位置,这个语句标号必须与此goto语句同在一个函数内。滥用goto语句将使程序的流程毫无规律,可读性差,对于初学者来说应尽量不用。 第四章能力点

21 / 26

1、熟练运用if语句以及switch语句的能力; 2、选择结构程序设计的能力;

3、在VC++6.0环境下进行选择结构程序调试的能力。

第5章 循环结构

循环结构是结构化程序设计的三种基本结构之一,在程序设计中对于那些需要重复执行的操作应该采用循环结构来完成,利用循环结构处理各类重复操作既简单又方便。在C语言中有三种可以构成循环结构的循环语句:while、do-while和for。 5.1 while语句和用while语句构成的循环结构 5.1.1 while循环的一般形式

由while语句构成的循环也称“当”型循环,while循环的一般形式如下: while(表达式)循环体 例如: k=0

while(k<10){ printf(“*”);k++;} 程序段将重复输出语句printf,输出10个*号。 说明:

(1)while是C语言的关键字。

(2)while后一对圆括号中的表达式可以是C语言中任意合法的表达式,但不能为空,由它来控制循环体是否执行。

(3)在语法上,循环体只能是一条可执行语句,若循环体内有多个语句,应该使用复合语句。

5.1.2 while循环的执行过程

while循环的执行过程如下:

(1)计算while后圆括号中表达式的值。当值为非0时,执行步骤(2);当值为0时,执行步骤(4)。

22 / 26

(2)执行循环体一次。 (3)转去执行步骤(1)。 (4)退出while循环。

由以上执行过程可知,while后圆括号中表达式的值决定了循环体是否将被执行。因此,进入while循环后,一定要有能使此表达式的值变为0的操作,否则循环将会无限制地进行下去,成为无限循环(死循环)。若此表达式的值不变,则循环体内应有在某种条件下强行终止循环的语句(如break等)。 请初学者注意:

(1)while语句的循环体可能一次都不执行,因为while后圆括号中的条件表达式可能一开始就为0。

(2)在设计循环时,通常应在循环体内改变条件表达式中有关变量的值,使条件表达式的值最终变成0,以便能结束循环。

(3)当循环体需要无条件循环,条件表达式可以设为1(恒真),但是循环体内要带条件的非正常出口(break等)。

5.2 do—while语句和用do—while语句构成的循环结构 5.2.1 do—while语句构成的循环结构 do—while循环结构的形式如下: do 循环体

while(表达式); 例如: do

{ i++;s+=i; }while(i<10); 说明:

(1)do是C语言的关键字,必须和while联合使用。

(2)do—while循环由do开始,至while结束。必须注意的是:在while(表达式)后的“;”不可丢,它表示do—while语句的结束。

(3)while后一对圆括号中的表达式,可以是C语言中任意合法的表达式,由它控制循环是否执行。

(4)按语法,在do和while之间的循环体只能是一条可执行语句。若循环体内需要多个语句,应该使用复合语句。

5.2.2 do—while循环的执行过程

23 / 26

do—while循环的执行过程如下: (1)执行do后面循环体中的语句。

(2)计算while后一对圆括号中表达式的值。当值为非0时,转去执行步骤(1);当值为0 时,执行步骤(3)。

(3)退出do—while循环。

由do—while构成的循环与while循环十分相似,它们之间的重要区别是:while循环的控制出现在循环体之前,只有当while后面条件表达式的值为非0时,才可能执行循环体,因此循环体可能一次都不执行;在do—while构成的循环中,总是先执行一次循环体,然后再求条件表达式的值,因此,无论条件表达式的值是0还是非0,循环体至少要被执行一次。 和while循环一样,在do—while循环体中,一定要有能使while后表达式的值变为0的操作,否则,循环将会无限制地进行下去,除非循环体中有带条件的非正常出口(break等)。

5.3 for语句和用for语句构成的循环结构 5.3.1 for语句构成的循环结构

for语句构成的循环结构通常称为for循环。for循环的一般形式如下: for(表达式1;表达式2;表达式3) 循环体 例如:for (k=0;k<10;k++) printf(“*”); 以上for循环在一行上输入10个*号。 for是C语言的关键字,其后的一对圆括号中通常含有三个表达式,各表达式之间用“;”隔开。这三个表达式可以是任意形式的表达式,通常主要用于for循环的控制,紧跟for(?)之后的循环体在语法上要求是一条语句,若需要多条语句,应该使用复合语句。 for循环的一般形式等价于下面的程序段: 表达式1;

while(表达式2) {

循环体 表达式3 }

5.3.2 for循环的执行过程 for循环的执行过程如下: (1)计算表达式1;

(2)计算表达式2,若其值为非0,转步骤(3);若其值为0,转步骤(5); (3)执行一次for循环体;

(4)计算表达式3,转向步骤(2); (5)结束循环。

24 / 26

5.3.3 有关for语句的说明

(1)for语句中的表达式可以部分或全部省略,但两个“;”不可省略。 例如:for( ; ;) printf(“*”);

三个表达式均省略,但因缺少条件判断,循环将会无限制地执行,而形成无限循环(通常称死循环)。

(2)for后一对圆括号中的表达式可以是任意有效的C语言表达式。 例如:for(sum=0,i=1;i<=100;sum=sum+i,i++){?} 表达式1和表达式3都是一个逗号表达式。

C语言中的for语句书写灵活,功能较强。在for后的一对圆括号中,允许出现各种形式的与循环控制无关的表达式,虽然这在语法上是合法的,但这样会降低程序的可读性。建议初学者在编写程序时,在for后面的一对圆括号内,仅含有能对循环进行控制的表达式,其他的操作尽量放在循环体内去完成。

5.4 循环结构的嵌套

在一个循环体内又完整地包含了另一个循环,称为循环嵌套。前面介绍的三种类型的循环都可以嵌套,循环的嵌套可以多层,但每一层的循环在逻辑上必须是完整的。

在编写程序时,循环嵌套的书写要采用缩进形式,像以下例题程序中所示,内循环中的语句应该比外循环中的语句有规律的向右缩进2~4列,这样的程序层析分明,易于阅读。 5.5 break和continue语句在循环体中的作用 5.5.1 break语句

用break语句可以使流程跳出switch语句体,也可以break语句在循环结构中终止本层循环体,从而提前结束本层循环。

例5 计算S=1+2+3+?+i,直到累加到S大于5000为止,并给出s和i的值。 #include main()

{ int i,s; s=0; for(i=1;;i++) { s=s+i;

if (s>5000) break; }

printf(“s=%d,i=%d\n”,s,i);} 程序的输出结果如下:s=5050,i=100

这是在循环体中使用break语句的示例。上例中,如果没有break语句,程序将无限循环下去,成为死循环。但当i=100时,s的值为100*101/2=5050,if语句中的条件表达式:s>5000 为“真”(值为l),于是执行break语句,跳出for循环,从而终止循环。 break语句的使用说明:

(1)只能在循环体内和switch语句体内使用break语句。

(2)当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体,并不能中止循环体的执行。若想强行中止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。 5.5.2 continue语句

continue语句的作用是跳过本次循环体中余下尚未执行的语句,立刻进行下一次的循环条件判定,可以理解为仅结束本次循环。注意:执行continue语句并没有使整个循环终止。 在while和do—while循环中,continue语句使得流程直接跳到循环控制条件的测试部分,然后决定循环是否继续进行。在for循环中,遇到continue后,跳过循环体中余下的语

25 / 26

句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试,最后根据“表达式2”的值来决定for循环是否执行。在循环体内,不论continue是作为何种语句中的语句成分,都将按上述功能执行,这点与break有所不同。 第五章能力点

1、熟练掌握while、do while、for三种循环语句编程的能力; 2、循环结构程序设计的能力;

3、在VC++6.0环境下进行循环结构程序调试的能力。

26 / 26

句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试,最后根据“表达式2”的值来决定for循环是否执行。在循环体内,不论continue是作为何种语句中的语句成分,都将按上述功能执行,这点与break有所不同。 第五章能力点

1、熟练掌握while、do while、for三种循环语句编程的能力; 2、循环结构程序设计的能力;

3、在VC++6.0环境下进行循环结构程序调试的能力。

26 / 26

本文来源:https://www.bwwdw.com/article/eeu3.html

Top