《全国计算机二级C语言复习资料(全面版).docx》由会员分享,可在线阅读,更多相关《全国计算机二级C语言复习资料(全面版).docx(229页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、二级C语言第1章C语言概述1.1 C语言基础知识1.1.1 C语言简介(:语言是一种结构紧凑、使用方便、程序执行效率高的编程语言, 它有9种控制语句、32个关键字(见表1-1)和34种运算符。C语言 的数据结构也非常丰富,它的多种数据类型可以实现如链表、树、 栈等复杂的运算,并且用结构化控制语句(if.else,for语句等)来 实现函数的模块化。C语言的语法不太严格,程序设计自由度大, 它可以直接访问物理地址,还可以直接对硬件操作。C语言也是一 种移植性比较好的语言。表1-1 C语言关键字autobreakcasecharconstcontinuedefaultdoubleelseenume
2、xternfloatforgotointlongregisterreturnshortsi gnedsizeofdoifstaticstructswitchtypedefuni onunsi gnedvoidvolatilewhile1.1.2 C语言程序的构成(1)C语言的源程序是由函数构成的,每一个函数完成相对独 立的功能,其中至少包括一个主函数(main ()函数)。(2)C程序总是从main ()函数开始执行。(3)C语言规定每个语句以分号(;)结束,分号是语句组成不 可缺少的部分,它在每条语句的最后出现。(4)程序的注释部分应括在/*与*/之间,和*之间不 能有空格,注释部分允许出现
3、在程序的任何位置。【例1】显示How are you !的C语言程序。#include main()/* 主函数 */printf( How are you ! n );/* 调用库函数printf ()显示字 符串*/运行结果是在屏幕上显示一行英文:How are you!。例题说明:(1)本程序是由一个main ()函数构成的。main是函数名,函 数名后面圆括号内是填写参数的,由于本程序主函数没有参数,所 以是空的,但括号不能省略。main()后面有一对花括号,花括号内 是由语句组成的函数体,本程序只有一个语句。(2) printf ()函数是C语言的库函数,它的功能是在屏幕上输 出指定
4、的内容,”n“是转义字符,它代表回车换行。(3)关于转义字符见表1-2。表1-2 C语言的转义字符及功能字符形式功能换行t横向跳格(代表【Tab】建)竖向跳格b退格符(代表Backspace键)r回车符号f走纸换页符反斜杠字符单引号(撇号)字符ddd3位八进制数所代表的一个ASCII字符xhh2位十六进制数所代表的一个ASCII字符0空值,-,双引号(撇号)字符1.1.3 C程序的生成过程C程序是先由源文件经编译生成目标文件,然后经过连接生成可 执行文件,如图1-1所示。开始图1-1编译过程源程序的扩展名为x ,目标程序的扩展名为.obj ,可执行程 序的扩展名为.exe o1.2常量、变量和
5、数据类型C语言提供的数据结构是以数据类型的形式出现的,且有常量与 变量之分,如图1-2所示。图1-2数据类型1.2.1 标识符在编写程序时,必须为函数、变量等命名,这个名字称为标识 符。标识符可以是一个或多个字符,标识符的第一个字符必须是字 母或下画线,随后的字符只能是字母、数字或下画线。要区分字母 的大小写,例如,t和T是两个不同的变量。下面的标识符是合法的:a5 , Data,str以下都是非法的标识符:#sum , 8m , str3:2, i-j标识符不能与程序中具有特殊意义的关键字相同,不能与用户 编制的函数名、C语言库函数相同,在程序中各种标识符尽量不要重复,以便区分。选择变量名和
6、其他标识符时,应注意做到见名 知义。1.2.2常量在程序运行中,其值不能被改变的量称为常量。常量有5种类型: 整型常量、实型常量、字符常量、字符串常量和符号常量。1.2.2.1 整型常量整型常量有3种形式:十进制整型常量、八进制整型常量和十六 进制整型常量。下面举例说明几种常量的书写方式。十进制整型常量:564 , 0 ,-23,851.等,基本数字范围为09。八进制整型常量:061 , 037L , -026 , 0773等,基本数字范 围为07。十六进制整型常量:0x66,0x1101, Ox, 0x5AC0,-0xFF,基本数字范围为09,从1015写为AF或af。其中L为长整型。1.2
7、.2.2 实型常量实型常量有两种表示形式:小数形式和指数形式。小数形式:45.30,000744 -623.0指数形式:45.3e0 4.53e-3-4.53e24.53el0.453e-2 -453e0453.0e-l453e-5-0.453e3(1)小数部分为0的实型常量,可以写为453.0或依照人们日 常习惯写为453 o(2)用小数表示时,小数点的两边必须有数,不能写成“.453” 和453.,而应该写成“0.453和453.0。(3)用指数写法时,e前必须有数字,e后面的指数必须为整数。1.1.1.1 符常量一个字符常量代表ASCII码字符集里的一个字符,在程序中用单 撇号括起来,以
8、便区分。如a,Jp Jw 。注意:,a, 和A,是两个不同的字符常量。除了形式上的字符常量外,C语言还有特殊的字符常量,如转义 字符常量Z。其中、是转义的意思,后面跟不同的字符表示 不同的意思,具体请参阅表1-2 o1.2.2.4 字符串常量字符串常量是用双撇号括起来的一个或一串字符。注意其与字 符常量的区别。书写形式如china, How are you, shou, 342mono。1.2.2.5 符号常量符号常量是由宏定义#define定义的常量,在C程序中可用标识 符代表一个常量。【例2】定义一个常量并输出。#include #define PI 3.14159main()float
9、a;a=PI; /* PI 表示3.14159*/printf( %f ,a);)运行结果是在屏幕上显示:3.141590o例题说明:#define是宏定义,有关宏定义在以后的章节中详细说明,此程 序中所有出现PI的地方都代表3.14159,同时PI称为符号常量。习惯上 我们用大写字母来表示符号常量,小写字母表示变量,这样比较容 易区别。1.2.3变量变量就是其值可以改变的量。变量要有变量名,在内存中占据 一定的存储单元,存储单元里存放的是该变量的值。不同类型的变 量其存储单元的大小不同,变量在使用前必须定义。1.23.1整型变量整型变量分为4种:基本型(int)、短整型(short int或
10、short)、长 整型(long int 或 long)和无符号型(unsigned int , unsigned short, unsigned long)。C标准没有具体规定各类数据所占内存的字节数,如基本型变量 (int)在IBM PC机上占1附,在IBM 370机型上占32位,而在 Honeywell机上则占36位。现以IBM PC为例,说明各类整型变量所占的位数及可表达的数 的范围,见表1-3。表1-3各类整型变量所表示数的范围类型所占位数数的范围说明si gnedint16-3276832767整型signed short int16-3276832767短整型si gned lo
11、ng int32-21474836482147483647长整型unsigned int160-65535无符号整型unsigned short int16065535无符号短整型unsigned long int32。4294967295无符号长整型1.2.3.2 实型变量实型变量分为单精度类型(float)和双精度类型(double )两种。 如:float a, b;double m;在一般的系统中,float型数据在内存中占4个字节(32位), double型数据占8个字节。单精度实数提供7位有效数字,双精度实 数提供1516位有效数字。实型常量不分float型和double型,一个
12、实型常量可以赋给一个float型或double型变量,但变量根据其类 型截取实型常量中相应的有效数字。1.2.3.3 字符变量字符变量用来存放字符常量,字符变量用关键字char说明,每 个字符变量中只能存放一个字符。定义形式:char crl, cr2 ;赋值:crl= m , cr2=/ n将一个字符赋给一个字符变量时,并不是将该字符本身存储到 内存中,而是将该字符对应的ASCII码存储到内存单元中。例如,字 符A的ASCII码为65,在内存中的存放形式如下:01000001由于在内存中字符以ASCII码存放,它的存储形式和整数的存储 形式类似,所以C语言中字符型数据与整型数据之间可以通用,
13、一 个字符能用字符的形式输出,也能用整数的形式输出,字符数据也 能进行算术运算,此时相当于对它们的ASCII码进行运算。1.2.4类型的自动转换和强制转换当同一表达式中各数据的类型不同时,编译程序会自动把它们 转变成同一类型后再进行计算。转换优先级为:char int float double即左边级别“低”的类型向右边转换。具体地说,若在表达式中 优先级最高的数据是double型,则此表达式中的其他数据均被转换 成double型,且计算结果也是double型;若在表达式中优先级最高 的数据是float型,则此表达式中的其他数据均被转换成float型,且 计算结果也是float型。在做赋值运算
14、时,若赋值号左右两边的类型不同,则赋值号右 边的类型向左边的类型转换;当右边的类型高于左边的类型时,则 在转换时对右边的数据进行截取。除自动转换外,还有强制转换,表示形式是:(类型)(表达式);第2章运算符与表达式2.1 C语言运算符简介2.1.1 C运算符简介C语言的运算符范围很宽,几乎把所有的基本操作都作为运算符 处理,具体运算符见表2-1。表27 C语吉运算符表名称运苴符算术运篁符关系运篁符位运算符1,八逻辑运算符1, II,*条件运苴符?:指针运箕符度, *赋值运算符=逗号运篁符字节运算符sizeof强制运菖符类型名)(表达式)其他下标,分量,函数另外,按参与运算的对象个数,C语言运算
15、符可分为:单目运算 符(如!卜双目运算符(如+,-)和三目运算符(如? : )o2.1.2 运算符的结合性和优先级在C语言的运算符中,所有的单目运算符、条件运算符、赋值 运算符及其扩展运算符,结合方向都是从右向左,其余运算符的结 合方向是从左向右。各类运算符优先级的比较:初等运算符单目运算符算术运算符(先乘除后加减)关系运算 符逻辑运算符(不包括“!)条件运算符赋值运算符逗号运算 符。说明:以上优先级别由左到右递减,初等运算符优先级最高, 逗号运算符优先级最低。2.1.3 强制类型转换运算符可以利用强制类型转换符将一个表达式转换成所需类型,其一 般形式为:(类型名)(表达式)例如:(char)
16、(x+y);,将(x+y)的值强制转换为字符型。(double)(m*n);,将(m*n)的值强制转换为doubl演型。表达式应用括号括起来,如果写成(char)x+y,则表示只将x转化 为字符型,然后与y相加。2.1.4 逗号运算符和逗号表达式用逗号运算符将几个表达式连接起来,例如a=b+c, b=a*a, c=a+b,称为逗号表达式。一般形式为:表达式1 ,表达式2 ,表达式3 ,,表达式n逗号表达式的求解过程是:先求解表达式1,然后依次求解表达 式2,直到表达式n的值。整个逗号表达式的值就是表达式n的值。 需要注意的是,逗号运算符是所有运算符中级别最低的。2.2 算术运算符和算术表达式2
17、.2.1 基本的算术运算符(1) +(加法运算符或正值运算符,如2+6)。(2)-(减法运算符或负值运算符,如6-3)。(3)*(乘法运算符,如2*8)。(4)/(除法运算符,如6/5)。(5)%(模运算符或称求余运算符,两侧均应为整型数据,如 9%7的值为2)。需要说明的是:两个整数相除的结果为整型,如5/3的结果值为 1,舍去小数部分,如果参加+、-、*、/运算的两个数中有一个数 为实数,则结果是double类型。2.2.2 算术表达式和运算符的优先级与结合性算术表达式是用算术运算符和括号将运算量(也称操作数)连接 起来的、符合C语言语法规则的表达式。运算对象包括函数、常量 和变量等。在计
18、算机语言中,算术表达式的求值规律与数学中的四则运算 的规律类似,其运算规则和要求如下。(1)在算术表达式中,可使用多层圆括号,但括号必须配对。运 算时从内层圆括号开始,由内向外依次计算各表达式的值。(2)在算术表达式中,对于不同优先级的运算符,可按运算符的 优先级由高到低进行运算,若表达式中运算符的优先级相同,则按 运算符的结合方向进行运算。如果一个运算符两侧的操作数类型不同,则先利用自动转换 或强制类型转换,使两者具有相同类型,然后进行运算。2.2.3 自增自减运算符作用:使变量的值增1或减1。如:+i, -i (在使用i之前,先使i的值加1、减1)。i+, i-(在使用i之后,使i的值加1
19、、减1)。只有变量才能用自增运算符(+)和自减运算符而常量或 表达式不能用,如10+或(x+y)+都是不合法的。(2)+和-的结合方向是自右向左,如-j+ , i的左边是负号运 算符,右边是自增运算符,负号运算和自增运算都是“自右向左” 结合的,相当于-(i+)o在循环语句中常用到自增(减)运算符,在指针中也常用到该 运算符,考生要弄清楚i+和+及和“T的区别,防止用错。2.3赋值运算符与赋值表达式2.3.1 赋值运算符和赋值表达式赋值符号就是赋值运算符,作用是将一个数据赋给一个变 量或将一个变量的值赋给另一个变量,由赋值运算符组成的表达式 称为赋值表达式。一般形式为:变量名=表达式在程序中可
20、以多次给一个变量赋值,每赋一次值,与它相应的 存储单元中的数据就被更新一次,内存中当前的数据就是最后一次 所赋值的那个数据。2.3.2 复合的赋值运算符在赋值运算符之前加上其他运算符可以构成复合赋值运算符。其中与算术运算有关的复合运算符是:+=,-=,*=,/=,%= 0两个符号之间不可以有空格,复合赋值运算符的优先级与赋值 运算符的相同。表达式n+=l等价于n=n+l,作用是取变量n中的值增 1再赋给变量n,其他复合的赋值运算符的运算规则依次类推。如求表达a+=a-=a*a的值,其中a的初值为12。步骤:(1)先进行a-=a*a运算,相当于2=2七*2=12-144=-132。(2)再进行a
21、+=-132运算,相当于 a=a+(-132)=-132-132= 264 o2.3.3 赋值运算中的类型转换如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把 右侧表达式求得的数值按赋值号左边变量的类型进行转换(也可以 用强制类型转换的方式),但这种转换仅限于某些数据之间,通常 称为赋值兼容。对于另一些数据,例如,后面将要讨论的地址值, 就不能赋给一般的变量,称为赋值不兼容“。常用的转换规则如下:当实型数据赋值给整型变量时,将实型数据的小数部分截断。如intx;,执行x=5.21;后,x的值为5。(2)当整型数据赋值给实型变量时,数值不变,但以浮点数形式 存储到实型变量中。如float
22、x=45;输出x的结果为45.00000。(3)当double类型数据赋值给float型变量时,取其前面7位的有效 数字,存放到float型变量的存储单元中,这时数值可能溢出。当字符型数据赋值给整型变量时,由于整型变量占两个字节, 而字符只占一个字节,只需将字符数据(8位)放到整型变量低8 位中,对该整型变量最高位进行符号扩展,其他位补零。(5)当整型、短整型、长整型数据赋值给一个char类型变量时, 将其低8位原封不动地送到char类型变量中(即截断)。2.4位运算在计算机中,数据都是以二进制数形式存放的,位运算就是指 对存储单元中二进制位的运算。2.4.1 位运算符和位运算C语言提供6种位
23、运算符,见表2-2。表2-2位运算符操作符含义规则&按位与若两个相应的二进制位都为1,则该位的结果为1,否则 为。1按位或两个相应的二进制位中只要有一个为1,则该位的结果为1 ,否则为0A按位异或若两个二进制位同号,则结果为。,异号则为1按位求反按位取反,即。变1, 1变0左移将一个数的二进制位全部左移若干位右移将一个数的二进制位全部右移若干位说明:(1)位运算中除以外,均为双目运算符,要求两侧 各有一个运算量。(2)运算量只能是整型或字符型数据,不能为实型数据。2.4.2 位运算举例【例1】下面程序的输出结果是。#include main()(char x=040;printf(%dn/x=
24、xl);例题解析:左移运算是每移一位数值将放大一倍,x为八进制数的 40,即十进制数的32,程序是以十进制数方式输出移位后的x,等 于64。实际上,按二进制数展开后也可得到正确结果。八进制数的40转换成二进制数为00100000 ,再按题意左移一位后得到 01000000 ,最后按printf语句中的d格式输出其十进制数形式为 64 o【例2】设二进制数a是00101101 ,若通过异或运算a/b使a 的高4位取反,低4位不变,则二进制数b是。例题解析:异或运算常用来使特定位翻转,只要使需翻转的位与1 进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得 0 ,原数中值为0的位与1进行
25、异或运算结果得1。而与。进行异或的 位将保持原值。异或运算还可用来交换两个值,不用临时变量。如 inta=3,b=4;,想将a与b的值互换,可用如下语句实现:a=aAb;b=bAa;a=aAb;所以本题的答案为:11110000 o【例3】位运算符&八按优先级从高到低排列的顺序是。例题解析:位运算符中求反运算优先级最高,而左移和右移相 同,居于第二,接下来的顺序是按位与”&“、按位异或和按 位或|o因此题中的正确顺序为| o第3章基本语句3.1 C语句概述C语言的语句用来向计算机系统发出指令,一个实际的源程序通 常包含若干语句,这些语句用来完成一定的操作任务。C程序中的语句,按照它们在程序中出
26、现的顺序依次执行,由这 样的语句构成的程序结构称为顺序结构。3.1.1 C语句分类3.1.1.1 控制语句控制语句完成一定的控制功能,C语言共有9种控制语句,见表3-1 o表3-1控制语句语句名称i f ( ), else 条件语句switch多分支选择语句for ( )循环语句while ( ),循环语句dowhile ()循环语句continue结束本次循环语句break终止执行switch或循环语句return返回语句说明:以上语句中()“表示一个条件,表示内嵌语句。3.1.1.2 其他类型语句函数调用语句(由函数调用加一个分号构成),如 scanf(%d,&a);。表达式语句(由一个表
27、达式;构成一个语句),如a=b; o3.1.1.3 空语句C语言中所有语句都必须由一个分号(;)结束,如果只有一个 分号如main();,这个分号也是一条语句,称为空语句,程序执行 时不产生任何动作,但表示存在着一条语句。3.1.1.4 复合语句在C语言中花括号“不仅可以用做函数体的开始和结束标志, 同时也常用做复合语句的开始和结束标志,复合语句也可称为 语句体。在C语言中,任何表达式都可以加上分号构成语句,如i+;o 随意加;”会导致很多逻辑上的错误,要慎用,不要乱用。复合语 句中最后一个语句中最后的分号不能忽略不写。3.2 赋值语句前面已经介绍赋值语句是由赋值表达式和末尾的分号(;)构 成
28、的。这里要提醒读者注意:=与“=是两个不同的运算符,前 者才是赋值运算符,而后者是关系运算符,用来进行条件判断,不 能把二者混为一谈。如i=2,功能是把数值2放到变量冲,而i=2 是判断变量i的值是否为2。加+1厂在程序执行时,首先取出冲的值, 执行加数值1的操作后再把新值放回到j中。3.3 输入输出概念及其实现数据从计算机内部向外部输出设备(如显示器、打印机等)输送 的操作称为”输出“,数据从计算机外部向输入设备(如键盘、鼠标、 扫描仪等)送入的操作称为输入“。(2)C语言本身不提供输入输出语句,可以通过函数来实现输入和 输出的操作。(3)在使用C语言库函数时,首先要用预编译命令includ
29、e将有 关的头文件包含到用户源文件中。这里需要用到编译预处理命令, 在后面的章节中我们会详细讲到。3.4 单个字符的输入输出3.4.1 字符输出函数putchar()putchar()函数的作用是向终端输出一个字符。如:putchar(a);它输出字符变量a的值,a也可以是字符型变量或整型变量。若a 是整型变量,则输出的是ASCII码值为该变量值的那个字符。3.4.2 字符输入函数getchar。getchar()函数的作用是从终端输入一个字符,getchar ()函数 没有参数,函数值就是从输入设备得到的字符。getchar。只能接收一个字符,getchar。函数得到的字符可以赋给 一个字符
30、变量或整型变量,也可以不赋给任何变量,作为表达式的 一部分。如果在一个函数中(今为main。函数)要调用getchar()和 putchar。函数,在该主函数之前的包含命令#include 必不可少的。3.5 数据格式的输入与输出3.5.1 printf()函数printf()函数是C语言提供的标准输出函数,它的作用是向终端 (或系统隐含指定的输出设备)按指定格式输出若干个数据。3.5.1.1 printf()函数的一般形式printf(格式控制,输出表列);如:printf(%f,%d,x,y);printf是函数名,括号内由以下两部分组成:(1)”格式控制“:用双引号括起来的字符串是格式控
31、制“字符串, 它包括两种信息。格式转换说明,由和格式字符组成,如d、s等。上 例中,当输出项为int型时,系统规定用d作为格式描述字符,因此, 有d。当输出项为float或double类型时,用f或e作为格式描述字 符。格式描述符要与输出项一一对应且类型匹配。需要原样输出的字符(通常指除了格式说明与一些转义字符 外的那部分)也写在格式控制内。(2)输出表列是需要输出的一些数据,可以是常量、变量或表 达式。例如:printf(x=%d y=%d,x/y);其中,x=%dy=%d是格式说明;x,y是输出表列。输出表列中 的各输出项要用逗号隔开。若x, y的值为7, 8 ,以上两条输出结 果为:x=
32、7 y=8在两数之间有空格,因为在两个格式说明符中间有一个空格。3.5.1.2 格式字符可以根据需要在与格式字符之间插入“宽度说明“、左对齐符 号前导零符号0”等。(l)d格式符,用来对十进制数进行输入输出,其中“d”按整型 数据的实际长度输出,“md指定m为输出字段所占的宽度。(2)0格式符,以八进制数形式输出整数,同样可以通过如8o” 的格式指定输出时所占的宽度。(3)x格式符,以十六进制数形式输出整数,同样可以通过如 %12x的格式指定输出时所占的宽度。(4)u格式符,用来输出unsigned型数据,即输出无符号的十进 制数。(5)c格式符,用来输出一个字符。(6)s格式符,用来输出一个
33、字符串。f格式符,用来输出实数(包括单、双精度),以小数形式输出, 使整数部分全部如数输出。(8)e格式符,以指数形式输出实数。(9)g格式符,用来输出实数。对于f、e、g格式符可以用整型数1整型数2“的形式,在指定 宽度的同时来指定小数位的位数,其中,整型数1用来指定输出 数据所占的总宽度,整型数2”用来确定精度。精度对于不同的格 式符有着不同的含义。当输出位数多于整型数2”指定的宽度时, 截去右边多余的小数,并对截去的第一位小数做四舍五入处理。当 输出数据的小数位数少于整型数2”指定的宽度时,在小数的最右 边添0,当输出的数据所占的宽度大于整型数1指定的宽度时,小 数位仍按上述规则处理,整
34、数部分并不丢失。也可以用”整型数 2”的形式来指定小数位数,这时输出的数据所占宽度由系统决定。 通常,系统对float类型提供7位有效位数,对于double类型提供15 位有效位数。3.5.1.3 使用printf()函数时的注意事项在格式控制字符串中,格式说明与输出项从左到右在类型上 必须一一对应匹配,如不匹配将导致数据输出出现错误,如在输出 long型数据时,一定要用壮格式控制,而不能用1格式控制。(2)在格式控制串中,格式说明与输出项的个数也要相等,如格 式说明的个数多于输出项的个数,则对于多余的格式将输出不定值 (或唯)。(3)在格式控制串中,除了合法的格式说明外,可以包含任意的 合法
35、字符(包括转义字符),这些字符在输出时将被“原样输出,(4)如果要算出%,则应该在格式控制串中用两个连续的百分 号%来表示。3.5.2 scanf()函数3.5.2.1 scanf()函数的一般形式scanf(格式控制,地址表列);其中scanf是函数名,格式控制的含义同print)函数,地址 表列”由若干个变量地址组成,既可以是变量的地址,也可以是字 符串的首地址(参见“字符数组”一节)。例如:scanf(%cT,&a);printf(%cT,a);运行时输入123,按回车键后则会在屏幕上输出整型变量a的值 123 o其中d是格式控制字符串。&a是输入项。其中的是 取地址运算符“,&a指a在
36、内存中的地址,如需要有多个输入项时, 输入项之间要用逗号隔开。在实际输入时,若一次向计算机输入多个数据,则每两个数据间要以一个或多个空格间隔,也可以用回车 键或跳格键【Tab】。352.2格式说明scan)函数中的格式说明也是以开始,以一个格式字符结束, 中间可以加入附加的字符。说明:对unsigned型变量的数据,可以用d、o、x格式输入。(2)在scan)函数中格式字符前可以用一个整数指定输入数据所 占宽度,但对于实型数则不能指定其小数位的宽度。在格式控制串中,格式说明的个数应该与输入项的个数相等, 且要类型匹配,如不匹配,系统也不会给出出错信息,但有可能使 程序的结果不正确。若格式说明的
37、个数少于输入项的个数,scanf() 函数结束输入,多余的项继续从终端接收新的数据,若格式说明的 个数多于输入项个数时,scan)函数同样也结束输入。3.5.23使用scanf()函数时应注意的问题(l)scanf()函数中的输入项只能是地址表达式,而不能是变量名 或其他内容,也就是说输入项必须是某个存储单元的地址,这一点 一定要掌握。例如:int m,n;scanf(%d,%d,m,n);是不对的,应将其中的m,n改为如果在“格式控制字串中除了格式说明以外还有其他字符, 则在输入数据时应输入与这些字符相同的字符。(3)在用c格式输入字符时,空格字符和转义字符都作为有效 字符输入。在输入数据时
38、,若实际输入数据少于输入项个数,scanf()函 数会等待输入,直到满足条件或遇到非法字符才结束;若实际输入 数据多于输入项个数,多余的数据将留在缓冲区备用,作为下一次 输入操作的数据。在输入数据时,遇到以下情况时认为输入结束。遇空格、按“回车或跳格(【Tab】)键,上述字符统一可称为 间隔符。在程序运行到要求实际输入时,间隔符的数目不限,按指定的 宽度结束,如3d,只取3列。scan)函数中的格式控制串是为输入数据用的,其间的字符不 能实现原样输出。若想在输入时出现提示性语言,则需要另外使用 print储句。第4章选择结构4.1 关系运算符和关系表达式关系运算是逻辑运算中较简单的一种。所谓“
39、关系运算”其实就 是“比较运算”,对两个值进行比较,判断其比较后的结果是否符合 指定条件,从而执行不同的程序段。4.1.1 关系运算符及其优先次序C语言提供了 6种关系运算符,见表4-1。表4-1关系运算符关系运苴符名称小于=大于或等于大于等于!二不等于由两个字符组成的运算符之间不可以加空格,关系运算符都是 双目运算符。结合性:自左向右。(2)优先次序:前4种关系运算符(, =, )的优先级别相同, 后两种(=,!=)优先级相同,且前4种优先级高于后两种;关系运 算符的优先级低于算术运算符,高于赋值运算符。4.1.2 关系表达式由关系运算符连接而成的表达式(可以是算术表达式、关系表达 式或其他
40、表达式)称为关系表达式。当关系运算符两边值的类型不一致时,若一边是整型,一边是 实型,系统将自动把整型数转化为实型数,然后再进行比较。4.2 逻辑运算符和逻辑表达式4.2.1 逻辑运算符及其优先级C语言提供了3种逻辑运算符,见表与2。表4-2逻辑运算符关系运苴符名称小于大于-等于!二不等于&和|是双目运算符,要求要有两个操作数,而“!”是单 目运算符,只要求有一个操作数即可。以上逻辑运算符的优先级是:(逻辑非)级别最高,其次是&(逻辑与),“ 11”(逻辑或)级别最低, 逻辑运算符中的“&“和低于关系运算符,高于算术运算符。即:!(逻辑非)算术运算符关系运算符& |赋值运 算符。4.2.2 逻
41、辑表达式逻辑表达式由逻辑运算符和运算对象组成,其中,参与逻辑运 算的对象可以是一个具体的值,还可以是C语言中任意合法的表达 式,逻辑表达式的运算结果为1(真)或者为0(假)。若a=5,则!a的值 为0,a的值为5(是非唯),被认做真,对它进行啡“运算后,结果为假,即结果为0。当谢B的值结合方式不同时,各种逻辑 运算所得到的结果是不同的,见表4-3。表4-3逻辑运算表AB!A!BA|B110011100101011001001100值得注意的是:在数学中,关系式0x10是可以使用的,表示x 的值应在大于0且小于10的范围内,但在C语言中却不能用0。10 这样一个关系表达式来表示上述的逻辑关系,即
42、关系运算符不能连 用,但可以借助逻辑运算符来辅助运算,正确的表示方法是0x & xy)&(n=cd),其中x=l,y=2,c=3,d=4,若m和n原值为 1,由于 xy喻值%0,因此m=0,而未执行riRd,所以n的值不是。而是 原值1。读者要注意这一点。4.3 if语句和用i储句构成的选择结构if语句用来对所给定的条件进行判定,判断其表达式的值是否满 足某种条件,并根据判定的结果(真或假)决定执行给出的两种操作 中的哪一种。43.1 if语句的几种形式(1) if(表达式)语句例如:if(ab)printf(The answer is right!n);其中,if是C语言的关键字,ab是条件
43、判断表达式。表达式两 侧的括号不可少,并且只能是圆括号,不能用其他括号替代。紧跟 着的是一条输出语句,称为if子句,如果在i仔句中需要多个语句, 则应该使用大括号()把一组语句括起来构成复合语句,这样在 语法上满足一条语句”的要求。(2)if(表达式)语句1else语句2例如:if(ab)printf(The answer is right.n);else printf(The answer is wrong.n);(3)if (表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3I IIelse if(表达式m)语句melse语句n语句1是if子句,语句2语句m是else子句。这些子句在语法 上要求是一条语句,但需要执行多条语句时,则应该使用花括号() 把这些语句括起来组成复合语句。else不能独立成为一条语句,它只是i储句的一部分,不允许单 独出现在程序中。else必须与if配对,共同组成if.else语句。4.3.2 if语句的嵌套在i储句中又包含一个或多个i储句结构,称为i储句的嵌套,一 般形式如下:if()if()语句1else语句2elseif()语句3else语句4应当注意:else总是与它上面的最近的没有与else配对的if配对。4.3.3 条件运算符构成的选择结构有如下语句:if(xy)min=x;/*求两数中较小
限制150内