配色: 字号:
全国计算机等级考试考点分析、题解与模拟(二级C)
2017-09-02 | 阅:  转:  |  分享 
  
全国计算机等级考试考点分析、题解与模拟2006版(二级C)



本文章下载于Txt66.com



C语言概述运算符与表达式

考核知识点
C语言运算符的种类、运算符优先级和结合性
不同类型数据间的转换与运算
C语言表达式的各种类型和求值规则
位运算符的含义及使用
简单的位运算重要考点提示
根据对历年的试卷分析可知,本章考核内容约为10%。主要考核以下几个方面:
运算符的优先级及表达式的求值规则
复合的赋值表达式的使用,自增和自减运算符及逻辑运算符的使用
简单的位运算操作
2.1C语言运算符简介
考点1C运算符简介
C语言的运算符范围很宽,几乎把所有的基本操作都作为运算符处理,具体运算符见表21。
表21C语言运算符表
名称运算符算术运算符+,-,,/,%关系运算符>,>=,==,!=,>,考点2运算符的结合性和优先级
(1)在C语言的运算符中,所有的单目运算符、条件运算符、赋值运算符及其扩展运算符,结合方向都是从右向左,其余运算符的结合方向是从左向右。
(2)各类运算符优先级的比较:
初等运算符>单目运算符>算术运算符(先乘除后加减)>关系运算符>逻辑运算符(不包括“!”)>条件运算符>赋值运算符>逗号运算符。
说明:以上优先级别由左到右递减,初等运算符优先级最高,逗号运算符优先级最低。
考点3强制类型转换运算符
可以利用强制类型转换符将一个表达式转换成所需类型,其一般形式为:
(类型名)(表达式)
例如:
(char)(x+y);,将(x+y)的值强制转换为字符型。
(double)(mn);,将(mn)的值强制转换为double类型。
表达式应用括号括起来,如果写成(char)x+y,则表示只将x转化为字符型,然后与y相加。
考点4逗号运算符和逗号表达式
用逗号运算符将几个表达式连接起来,例如a=b+c,b=aa,c=a+b,称为逗号表达式。
一般形式为:
表达式1,表达式2,表达式3,…,表达式n
逗号表达式的求解过程是:先求解表达式1,然后依次求解表达式2,直到表达式n的值。整个逗号表达式的值就是表达式n的值。需要注意的是,逗号运算符是所有运算符中级别最低的。
2.2算术运算符和算术表达式
考点5基本的算术运算符
(1)+(加法运算符或正值运算符,如2+6)。
(2)-(减法运算符或负值运算符,如6-3)。
(3)(乘法运算符,如28)。
(4)/(除法运算符,如6/5)。
(5)%(模运算符或称求余运算符,%两侧均应为整型数据,如9%7的值为2)。
需要说明的是:两个整数相除的结果为整型,如5/3的结果值为1,舍去小数部分,如果参加+、-、、/运算的两个数中有一个数为实数,则结果是double类型。
考点6算术表达式和运算符的优先级与结合性
算术表达式是用算术运算符和括号将运算量(也称操作数)连接起来的、符合C语言语法规则的表达式。运算对象包括函数、常量和变量等。
在计算机语言中,算术表达式的求值规律与数学中的四则运算的规律类似,其运算规则和要求如下。
(1)在算术表达式中,可使用多层圆括号,但括号必须配对。运算时从内层圆括号开始,由内向外依次计算各表达式的值。
(2)在算术表达式中,对于不同优先级的运算符,可按运算符的优先级由高到低进行运算,若表达式中运算符的优先级相同,则按运算符的结合方向进行运算。
(3)如果一个运算符两侧的操作数类型不同,则先利用自动转换或强制类型转换,使两者具有相同类型,然后进行运算。
考点7自增自减运算符
作用:使变量的值增1或减1。
如:++i,--i(在使用i之前,先使i的值加1、减1)。
i++,i--(在使用i之后,使i的值加1、减1)。
(1)只有变量才能用自增运算符(++)和自减运算符(--),而常量或表达式不能用,如10++或(x+y)++都是不合法的。
(2)++和--的结合方向是“自右向左”,如-i++,i的左边是负号运算符,右边是自增运算符,负号运算和自增运算都是“自右向左”结合的,相当于-(i++)。
在循环语句中常用到自增(减)运算符,在指针中也常用到该运算符,考生要弄清楚“i++”和“++i”及“i--”和“--i”的区别,防止用错。
2.3赋值运算符和赋值表达式
考点8赋值运算符和赋值表达式
赋值符号“=”就是赋值运算符,作用是将一个数据赋给一个变量或将一个变量的值赋给另一个变量,由赋值运算符组成的表达式称为赋值表达式。一般形式为:
变量名=表达式
在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋值的那个数据。
考点9复合的赋值运算符
在赋值运算符之前加上其他运算符可以构成复合赋值运算符。其中与算术运算有关的复合运算符是:+=,-=,=,/=,%=。
两个符号之间不可以有空格,复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,作用是取变量n中的值增1再赋给变量n,其他复合的赋值运算符的运算规则依次类推。
如求表达a+=a-=aa的值,其中a的初值为12。
步骤:(1)先进行“a-=aa”运算,相当于a=a-aa=12-144=-132。
(2)再进行“a+=-132”运算,相当于a=a+(-132)=-132-132=-264。
考点10赋值运算中的类型转换
如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换(也可以用强制类型转换的方式),但这种转换仅限于某些数据之间,通常称为“赋值兼容”。对于另一些数据,例如,后面将要讨论的地址值,就不能赋给一般的变量,称为“赋值不兼容”。常用的转换规则如下:
(1)当实型数据赋值给整型变量时,将实型数据的小数部分截断。
如intx;,执行“x=5.21;”后,x的值为5。
(2)当整型数据赋值给实型变量时,数值不变,但以浮点数形式存储到实型变量中。
如floatx=45;
输出x的结果为45.00000。
(3)当double类型数据赋值给float型变量时,取其前面7位的有效数字,存放到float型变量的存储单元中,这时数值可能溢出。
(4)当字符型数据赋值给整型变量时,由于整型变量占两个字节,而字符只占一个字节,只需将字符数据(8位)放到整型变量低8位中,对该整型变量最高位进行符号扩展,其他位补零。
(5)当整型、短整型、长整型数据赋值给一个char类型变量时,将其低8位原封不动地送到char类型变量中(即截断)。
2.4位运算
在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。
考点11位运算符和位运算
C语言提供6种位运算符,见表22。
表22位运算符
操作符含义规则&按位与若两个相应的二进制位都为1,则该位的结果为1,否则为0|按位或两个相应的二进制位中只要有一个为1,则该位的结果为1,否则为0∧按位异或若两个二进制位同号,则结果为0,异号则为1~按位求反按位取反,即0变1,1变0>右移将一个数的二进制位全部右移若干位说明:(1)位运算中除“~”以外,均为双目运算符,要求两侧各有一个运算量。
(2)运算量只能是整型或字符型数据,不能为实型数据。
考点12位运算举例
【例1】下面程序的输出结果是。
#include
main()
{
charx=040;
printf("%d\n",x=x}
例题解析:左移运算是每移一位数值将放大一倍,x为八进制数的40,即十进制数的32,程序是以十进制数方式输出移位后的x,等于64。实际上,按二进制数展开后也可得到正确结果。八进制数的40转换成二进制数为00100000,再按题意左移一位后得到01000000,最后按printf语句中的“%d”格式输出其十进制数形式为64。
【例2】设二进制数a是00101101,若通过异或运算a∧b使a的高4位取反,低4位不变,则二进制数b是。
例题解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。如inta=3,b=4;,想将a与b的值互换,可用如下语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
所以本题的答案为:11110000。
【例3】位运算符&|~>∧按优先级从高到低排列的顺序是。
例题解析:位运算符中求反运算“~”优先级最高,而左移和右移相同,居于第二,接下来的顺序是按位与“&”、按位异或“∧”和按位或“|”。因此题中的正确顺序为~>&∧|。
2.5经典题解
一、选择题
1以下程序的输出结果为()。
#include
main()
{
inti=4,a;
a=i++;
printf("a=%d,i=%d",a,i);
}
A)a=4,i=4B)a=5,i=4C)a=4,i=5D)a=5,i=5
答案:C)
解析:本题考查的是自增运算符及赋值运算符的综合使用问题。自增运算符是一元运算符,其优先级比赋值运算符高,要先计算。把表达式i++的值赋予a,由于i++的结果为当前i的值(当前i的值为4),所以i++的值为4,得到a的值为4。同时,计算了i++后,i由4变为5。
2在C语言中,要求参加运算的数必须是整数的运算符是()。
A)%B)/C)!D)
答案:A)
解析:选项A)中,%是求余运算符,它的运算对象必须是整型。选项B)中,“/”是除法运算符,它的运算对象可以是整型也可以是实型。选项C)中,“!”是求逻辑“非”的运算符,它是一个单目运算符,在它右边可以是任意合法的表达式。选项D)中所示的“”用于指针运算。
3下述程序的输出结果是()。
#include
voidmain()
{
chara=3,b=6;
charc=a∧bprintf("\n%d",c);
}
A)27B)10C)20D)28
答案:A)
解析:本例中的关键是运算符的优先次序问题。因为4若已定义x和y为double类型,则表达式“x=1,y=x+3/2”的值是()。
A)1B)2C)20D)25
答案:C)
解析:本题中的表达式为逗号表达式,此表达式的结果为y=x+3/2的值。y=x+3/2的运算次序为:先进行3/2运算,两个运算数均为整型量,结果也为整型量,等于1,此结果将与double类型数进行相加,要转换为100…00。最后将x的值1转换成double型,与100…00相加。
5若变量已正确定义并赋值,符合C语言语法的表达式是()。
A)a=a+7;B)a=7+b+c,a++C)int(123/4)D)a=a+7=c+b
答案:B)
解析:选项A)中,a=a+7;赋值表达式的最后有一个分号“;”,C语言规定,语句用分号结束,所以a=a+7;是一条赋值语句,而不是表达式。选项B)中,“a=7+b+c,a++”是一个逗号表达式,它由a=7+b+c和a++两个表达式组成,前者是一个赋值表达式,后者是一个自增1的赋值表达式,所以它是一个合法的表达式。选项C)中,int(123/4)看似是一个强制类型转换表达式,但语法规定,类型名应当放在一对圆括号内才构成强制类型转换运算符,因此写成(int)(123/4)才是正确的。在使用强制类型转换运算符时,需要注意运算符的优先级,例如,(int)(364)和(int)364中因为(int)的优先级高于运算符,因此它们将有不同的计算结果。选项D)中,a=a+7=c+b看似是一个赋值表达式,但是在a+7=c+b中,赋值号的左边是一个算术表达式a+7;按规定,赋值号的左边应当是一个变量或一个代表某个存储单元的表达式,以便把赋值号的右边的值存放在该存储单元中,因此赋值号的左边不可以是算术表达式,因为它不能代表内存中任何一个存储单元。
6若a为整型变量,则以下语句()。
a=-2L;
printf("%d\n",a);
A)赋值不合法B)输出值为-2C)输出为不确定值D)输出值为2
答案:B)
解析:本题的关键是要弄清楚C语言中常量的表示方法和有关的赋值规则。在一个整型常量后面加一个字母l或L,则认为是longint型常量。一个整型常量,如果其值在-32768~+32767范围内,可以赋给一个int型或longint型变量;但如果整型常量的值超出了上述范围,而在-2147483648~2147483647范围内,则应将其值赋给一个longint型变量。本例中-2L虽然为longint型变量,但是其值为-2,因此可以通过类型转换把长整型转换为短整型,然后赋给int型变量a,并按照%d格式输出该值。
7下述语句的输出为()。
intm=-1;
printf("%d,%u,%o",m,m,m);
A)-1,-1,-1B)-1,32767,-177777
C)-1,32768,177777D)-1,65535,177777
答案:D)
解析:为了给出此题的正确答案,必须弄清-1在内存中的存储形式。在内存中-1是以补码的形式存储的:1111111111111111,即16个1的形式。如果将其视为有符号数,即按%d的格式输出,最高位是符号位,1表示负数,计算出原码,其值为-1;若将此数视为无符号数,即按%u的格式输出,则最高位被看做是数据位,直接计算出其值是65535;若按%o格式输出,即按八进制数输出,其值是177777。
8若k为int型变量,则以下语句()。
k=8567;
printf("|%-06d|\n",k);
A)输出格式描述不合法B)输出为|008567|
C)输出为|8567|D)输出为|-8567|
答案:C)
解析:因为输出格式符是%-06d,含义是输出值占6个位置,左边对齐,右边不满6个补空格,其他的都原样输出。
9已知字符A的ASCII码值是65,以下程序()。
#include
main()
{
chara=′A′;
intb=20;
printf("%d,%o",(a=a+1,a+b,b),a+′a′-′A′,b);
}
A)表达式非法,输出零或不确定值
B)因输出项过多,无输出或输出不确定值
C)输出结果为20,141
D)输出结果为20,1541,20
答案:C)
解析:首先应该注意到printf()函数有3个实参数:(a=a+1,a+b,b)。a+′a′-′A′和b,并没有问题,可见选项A)错误。由于格式控制符串“%d,%o”中有两个描述符项,而后面又有表达式,因此,必定会产生输出,选项B)也是错误的。既然控制字符串中只有两个格式描述符,输出必然只有两个数据,故选项D)错误。
10对于条件表达式(M)?(a++):(a--),其中的表达式M等价于()。
A)M==0B)M==1C)M!=0D)M!=1
答案:C)
解析:因为条件表达式e1?e2:e3的含义是e1为真时,其值等于表达式e2的值,否则为表达式e3的值。“为真”就是“不等于假”,因此M等价于M!=0。
11在x值处于-2~2,4~8时值为“真”,否则为“假”的表达式是()。
A)(2>x>-2)||(4>x>8)
B)!(((x2))&&((x8)))
C)(x=-2)&&(x>4)&&(xD)(x>-2)&&(x>4)||(x答案:B)
解析:本题是考查关系运算和逻辑运算的混合运算。要给出此题的正确答案,首先需要了解数学上的区间在C语言中的表示方法,如x在[a,b]区间,其含义是x既大于等于a又小于等于b,相应的C语言表达式是x>=a&&x12已知小写字母a的ASCII码为97,大写字母A的ASCII码为65,以下程序的结果为()。
#include
main()
{
unsignedinta=32,b=66;
printf("%c\n",a|b);
}
A)66B)98C)bD)B
答案:C)
解析:先将a和b转化为二进制数,分别是:a=00100000,b=01000010。a|b的值为01100010,将结果转化为十进制数是98。由于C语言字符型数据和整型数据是通用的,因此98按字符型输出应该是小写字母b。
13设有定义chara,b;若想通过a&b运算保留a的第3位和第6位的值,则b的二进制数应是()。
A)00100100B)11011011C)00010010D)01110010
答案:A)
解析:由“按位与”运算的功能可知:两个对应的二进制数只要有一个为0,“按位与”的结果就为0,只有它们均为1时结果才为1。因此,若想保留哪位上的数,就用1去“按位与”,其他位用0屏蔽掉。
二、填空题
1若i为int整型变量且赋值为6,则运算i++后表达式的值是,变量i的值是。
答案:67
解析:i++是自加运算,由于加号在后边,所以是后加,因此表达式i++的值还是6,i经过自加后本身的值已变为7。
2条件“20答案:((x>20)&&(x解析:在C语言程序中,一般采用关系表达式和逻辑表达式的组合形式表示给定的条件。两个条件表示“并且”关系时,一般使用逻辑运算中的逻辑与“&&”;两个条件用“或”连接时,一般使用逻辑运算符中的逻辑或“||”。
3设二进制数a是00101101,若想通过异或运算a∧b使a的高4位取反,低4位不变,则二进制数b应是。
答案:11110000
解析:本题考查的是位运算中的按位异或运算表达式的计算方法。根据二进制按位进行异或运算的原则:只有对应的两个二进制位不同时,结果的相应的二进制位才为1,否则为0。很容易得到b的值为11110000。
4下面程序的输出结果是。
#include
main()
{
intx=023;
printf("%d\n",--x);
}
答案:18
解析:本题考查的是整型常量的表达方法和算术运算符中的自减运算符“--”的用法。题中的x=023是整型量的八进制数表示法,等价于x=19。对于自减表达式“--x”,运算后表达式的值为18,x的值也为18。
5请写出以下数学式的C语言表达式。
sin(a)bc
答案:sin(aπ/180)/(bc)
解析:本题考查的是C语言中表达式的表示方法。这里涉及了函数乘、除运算符的写法及其优先级、结合性。在C语言中使用数学函数sin()时,应注意自变量的单位是弧度,必须写成sin(aπ/180)的形式。
6对以下数学式,写出3个与a/cb等价的C语言表达式,,。
答案:ab/cba/cb/ca
解析:在C语言中“乘号”和“除号”的优先级相等,运算的顺序(结合方向)是自左向右。按此规则,以上代数式写成的C语言表达式可以是:ab/c,ba/c,或者b/ca(填空的顺序任意)。
2.6同步练习
一、选择题
1若有定义:intx=3,y=2;floata=25,b=35;则下面表达式的值为()。
(x+y)%2+(int)a/(int)b
A)10B)1C)20D)2
2若x和n均是int型变量,且x的初值为12,n的初值为5,则执行下面表达式后x的值为()。
x%=(n%=2)
A)0B)1C)2D)3
3假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为()。
A)7B)8C)9D)10
4下列程序的输出结果是()。
#include
main()
{doubled=32;intx,y;
x=12;y=(x+38)/50;
printf("%d\n",dy);}
A)3B)32C)0D)307
5设intx=1,y=1;表达式(!x||y--)的值是()。
A)0B)1C)2D)-1
6若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是()。
A)1B)2C)20D)25
7若变量a,i已正确定义,且i已正确赋值,则合法的语句是()。
A)i=int(a)B)++i;C)a=a++=5;D)a=int(i);
8若执行以下程序段后,c3的值为()。
intc1=1,c2=2,c3;
c3=10/c2c1;
A)0B)05C)1D)2
9如下程序的运行结果是()。
#include
main()
{inty=3,x=3,z=1;
printf("%d%d\n",(++x,y++),z+2);
}
A)34B)42C)43D)33
10能正确表示逻辑关系“a≥10或a≤0”的C语言表达式是()。
A)a>=10ora=0|aC)a>=10&&a=10||a11若变量x、y、z均为double类型且已正确赋值,不能正确表示xy×z的C语言表达式是()。
A)x/yzB)x(1/(yz))C)x/y1/zD)x/y/z
12设x、y、t均为int型变量,则执行语句:x=y=3;t=++x||++y;后,y的值为()。
A)不定值B)4C)3D)1
13设a、b、c、d、m、n均为int型变量,且a=5,b=6,c=7,d=8,m=2,n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为()。
A)0B)1C)2D)3
14假定w、x、y、z、m均为int型变量,有如下程序段:
w=1;x=2;y=3;z=4;
m=(w则该程序运行后,m的值是()。
A)4B)3C)2D)1
15下列程序的输出结果是()。
#include
main()
{
inta=0,b=0,c=0;
if(++a>0||++b>0)
++c;
printf("\na=%d,b=%d,c=%d",a,b,c);
}
A)a=0,b=0,c=0B)a=1,b=1,c=1
C)a=1,b=0,c=1D)a=0,b=1,c=1
16以下程序的输出结果是()。
#include
main()
{
inta=5,b=4,c=6,d;
printf("%d\n",d=a>b?(a>c?a:c):(b));
}
A)5B)4C)6D)不确定
17在C语言中,如果下面的变量都是int类型,则输出的结果是()。
sum=pad=5;pad=sum++,pad++,++pad;
printf("%d\n",pad);
A)7B)6C)5D)4
18以下程序的输出结果是()。
#include
main()
{
inti=010,j=10;
printf("%d,%d\n",++i,j--);
}
A)11,10B)9,10C)010,9D)10,9
19已知inti;floatf;,正确的语句是()。
A)(intf)%i;B)int(f)%i;C)int(f%i);D)(int)f%i;
20已知intj,i=1;,执行语句j=-i++;后,j的值是()。
A)1B)2C)-1D)-2
21已知inta=4,b=5;,则执行表达式a=a>b后,变量a的值为()。
A)0B)1C)4D)5
22C语言中,下列运算符的操作数必须是int类型的运算符是()。
A)%B)/C)--D)++
23判断char类型数据c1是否为大写字母的最简单且正确的表达式为()。
A)′A′=′A′)&(c1C)(′A′=c1)D)(c1>=′A′)&&(c124已知各变量的类型说明如下:
intk,a,b;
unsignedlongw=5;
doublex=1.42;
则以下不符合C语言语法的表达式是()。
A)x%(-3)B)w+=-2
C)k=(a=2,b=3,a+b)D)a+=a-=a(a=3)
二、填空题
1若a是int型变量,则执行表达式a=25/3%3后a的值为。
2若x和n均是int型变量,且x和n的初值均为5,则执行表达式x+=n++后x的值为,n的值为。
3若x和y都是double型变量,且x的初值为30,y的初值为20,则表达式pow(y,fabs(x))的值为。
4表达式pow(28,sqrt(double(x)))值的数据类型为。
5若a是int型变量,则表达式(a=45,a2),a+6的值为。
6若有定义intm=5,y=2;,则执行表达式y+=y-=m=y后y的值是。
7已知inty;floatx=-3;,执行语句y=x%2;后,变量y的值为。
8已知inta=15,b=240;则表达式(a&b)&b||b的结果为。
9表达式8.0(1/2)的值为。
10表达式3&4的值为。表达式3|4的值为。表达式3&&4的值为。
2.7同步练习答案
一、选择题
1B)2A)3C)4C)5B)6C)7B)8A)
9D)10D)11A)12C)13C)14D)15C)16C)
17A)18B)19D)20C)21A)22A)23D)24A)
二、填空题
1.2
2.106
3.8000000
4.double型
5.26
6.-16
7.语句本身是错误的
8.1
9.0.0
10.071



C语言概述基本语句

考核知识点
表达式语句、空语句和复合语句
数据的输入与输出,输入输出函数的调用
复合语句重要考点提示
根据对历年的试卷分析可知,本章考核内容约为10%。主要考核以下几个方面:
赋值语句的使用
格式输入输出,原样输出的使用
正确使用printf()函数和scanf()函数
3.1C语句概述
C语言的语句用来向计算机系统发出指令,一个实际的源程序通常包含若干语句,这些语句用来完成一定的操作任务。
C程序中的语句,按照它们在程序中出现的顺序依次执行,由这样的语句构成的程序结构称为顺序结构。
考点1C语句分类
1控制语句
控制语句完成一定的控制功能,C语言共有9种控制语句,见表31。
表31控制语句
语句名称if()…else…条件语句switch多分支选择语句for()…循环语句while()…循环语句do…while()循环语句continue结束本次循环语句break终止执行switch或循环语句return返回语句说明:以上语句中“()”表示一个条件,“…”表示内嵌语句。
2其他类型语句
函数调用语句(由函数调用加一个分号构成),如scanf("%d",&a);。
表达式语句(由一个表达式;构成一个语句),如a=b;。
3空语句
C语言中所有语句都必须由一个分号(;)结束,如果只有一个分号如main(){;},这个分号也是一条语句,称为空语句,程序执行时不产生任何动作,但表示存在着一条语句。
4复合语句
在C语言中花括号“{}”不仅可以用做函数体的开始和结束标志,同时也常用做复合语句的开始和结束标志,复合语句也可称为“语句体”。
在C语言中,任何表达式都可以加上分号构成语句,如“i++;”。随意加“;”会导致很多逻辑上的错误,要慎用,不要乱用。复合语句中最后一个语句中最后的分号不能忽略不写。
以下我们将详细介绍几种顺序执行的语句。
3.2赋值语句
前面已经介绍赋值语句是由赋值表达式和末尾的分号(;)构成的。这里要提醒读者注意:“=”与“==”是两个不同的运算符,前者才是赋值运算符,而后者是关系运算符,用来进行条件判断,不能把二者混为一谈。如“i=2;”,功能是把数值2放到变量i中,而i==2是判断变量i的值是否为2。“j=j+1;”在程序执行时,首先取出j中的值,执行加数值1的操作后再把新值放回到j中。
3.3输入输出概念及其实现
(1)数据从计算机内部向外部输出设备(如显示器、打印机等)输送的操作称为“输出”,数据从计算机外部向输入设备(如键盘、鼠标、扫描仪等)送入的操作称为“输入”。
(2)C语言本身不提供输入输出语句,可以通过函数来实现输入和输出的操作。
(3)在使用C语言库函数时,首先要用预编译命令“#include”将有关的“头文件”包含到用户源文件中。这里需要用到编译预处理命令,在后面的章节中我们会详细讲到。
3.4单个字符的输入输出
这里介绍C标准I/O函数库中最简单的对单个字符进行输入输出的函数putchar()和getchar()。
考点2字符输出函数putchar()
putchar()函数的作用是向终端输出一个字符。
如:
putchar(a);
它输出字符变量a的值,a也可以是字符型变量或整型变量。若a是整型变量,则输出的是ASCII码值为该变量值的那个字符。
考点3字符输入函数getchar()
getchar()函数的作用是从终端输入一个字符,getchar()函数没有参数,函数值就是从输入设备得到的字符。
getchar()只能接收一个字符,getchar()函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。如果在一个函数中(今为main()函数)要调用getchar()和putchar()函数,在该主函数之前的包含命令“#include”是必不可少的。
3.5数据格式的输入与输出
考点4printf()函数
printf()函数是C语言提供的标准输出函数,它的作用是向终端(或系统隐含指定的输出设备)按指定格式输出若干个数据。
1printf()函数的一般形式
printf(格式控制,输出表列);
如:
printf("%f,%d",x,y);
printf是函数名,括号内由以下两部分组成:
(1)“格式控制”:用双引号括起来的字符串是“格式控制”字符串,它包括两种信息。
①格式转换说明,由“%”和格式字符组成,如%d、%s等。上例中,当输出项为int型时,系统规定用d作为格式描述字符,因此,有“%d”。当输出项为float或double类型时,用f或e作为格式描述字符。格式描述符要与输出项一一对应且类型匹配。
②需要原样输出的字符(通常指除了格式说明与一些转义字符外的那部分)也写在格式控制内。
(2)“输出表列”是需要输出的一些数据,可以是常量、变量或表达式。例如:
printf("x=%dy=%d",x,y);
其中,“x=%dy=%d”是格式说明;x,y是输出表列。输出表列中的各输出项要用逗号隔开。若x,y的值为7,8,以上两条输出结果为:
x=7y=8
在两数之间有空格,因为在两个格式说明符中间有一个空格。
2格式字符
可以根据需要在“%”与格式字符之间(禁止)“宽度说明”、左对齐符号“-”、前导零符号“0”等。
(1)d格式符,用来对十进制数进行输入输出,其中“%d”按整型数据的实际长度输出,“%md”指定m为输出字段所占的宽度。
(2)o格式符,以八进制数形式输出整数,同样可以通过如“%8o”的格式指定输出时所占的宽度。
(3)x格式符,以十六进制数形式输出整数,同样可以通过如“%12x”的格式指定输出时所占的宽度。
(4)u格式符,用来输出unsigned型数据,即输出无符号的十进制数。
(5)c格式符,用来输出一个字符。
(6)s格式符,用来输出一个字符串。
(7)f格式符,用来输出实数(包括单、双精度),以小数形式输出,使整数部分全部如数输出。
(8)e格式符,以指数形式输出实数。
(9)g格式符,用来输出实数。
对于f、e、g格式符可以用“整型数1整型数2”的形式,在指定宽度的同时来指定小数位的位数,其中,“整型数1”用来指定输出数据所占的总宽度,“整型数2”用来确定精度。精度对于不同的格式符有着不同的含义。当输出位数多于“整型数2”指定的宽度时,截去右边多余的小数,并对截去的第一位小数做四舍五入处理。当输出数据的小数位数少于“整型数2”指定的宽度时,在小数的最右边添0,当输出的数据所占的宽度大于“整型数1”指定的宽度时,小数位仍按上述规则处理,整数部分并不丢失。也可以用“整型数2”的形式来指定小数位数,这时输出的数据所占宽度由系统决定。通常,系统对float类型提供7位有效位数,对于double类型提供15位有效位数。
3使用printf()函数时的注意事项
(1)在格式控制字符串中,格式说明与输出项从左到右在类型上必须一一对应匹配,如不匹配将导致数据输出出现错误,如在输出long型数据时,一定要用%ld格式控制,而不能用%d格式控制。
(2)在格式控制串中,格式说明与输出项的个数也要相等,如格式说明的个数多于输出项的个数,则对于多余的格式将输出不定值(或0值)。
(3)在格式控制串中,除了合法的格式说明外,可以包含任意的合法字符(包括转义字符),这些字符在输出时将被“原样输出”。
(4)如果要输出“%”,则应该在格式控制串中用两个连续的百分号“%%”来表示。
考点5scanf()函数
1scanf()函数的一般形式
scanf(格式控制,地址表列);
其中scanf是函数名,“格式控制”的含义同printf()函数,“地址表列”由若干个变量地址组成,既可以是变量的地址,也可以是字符串的首地址(参见“字符数组”一节)。
例如:
scanf("%d",&a);
printf("%d",a);
运行时输入123,按回车键后则会在屏幕上输出整型变量a的值123。其中“%d”是格式控制字符串。&a是输入项。其中的“&”是“取地址运算符”,&a指a在内存中的地址,如需要有多个输入项时,输入项之间要用逗号隔开。在实际输入时,若一次向计算机输入多个数据,则每两个数据间要以一个或多个空格间隔,也可以用回车键或跳格键【Tab】。
2格式说明
scanf()函数中的格式说明也是以%开始,以一个格式字符结束,中间可以加入附加的字符。
说明:
(1)对unsigned型变量的数据,可以用%d、%o、%x格式输入。
(2)在scanf()函数中格式字符前可以用一个整数指定输入数据所占宽度,但对于实型数则不能指定其小数位的宽度。
(3)在格式控制串中,格式说明的个数应该与输入项的个数相等,且要类型匹配,如不匹配,系统也不会给出出错信息,但有可能使程序的结果不正确。若格式说明的个数少于输入项的个数,scanf()函数结束输入,多余的项继续从终端接收新的数据,若格式说明的个数多于输入项个数时,scanf()函数同样也结束输入。
3使用scanf()函数时应注意的问题
(1)scanf()函数中的输入项只能是地址表达式,而不能是变量名或其他内容,也就是说输入项必须是某个存储单元的地址,这一点一定要掌握。
例如:
intm,n;
scanf("%d,%d",m,n);
是不对的,应将其中的“m,n”改为“&m,&n”。
(2)如果在“格式控制”字串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
(3)在用“%c”格式输入字符时,空格字符和转义字符都作为有效字符输入。
(4)在输入数据时,若实际输入数据少于输入项个数,scanf()函数会等待输入,直到满足条件或遇到非法字符才结束;若实际输入数据多于输入项个数,多余的数据将留在缓冲区备用,作为下一次输入操作的数据。
在输入数据时,遇到以下情况时认为输入结束。
遇空格、按“回车”或“跳格”(【Tab】)键,上述字符统一可称为“间隔符”。
在程序运行到要求实际输入时,间隔符的数目不限,按指定的宽度结束,如“%3d”,只取3列。
scanf()函数中的格式控制串是为输入数据用的,其间的字符不能实现原样输出。若想在输入时出现提示性语言,则需要另外使用printf语句。
3.6经典题解
一、选择题
1若有说明:doublea;则正确的输入语句为()。
A)scanf("%lf",a);B)scanf("%f",&a);
C)scanf("%lf",&a)D)scanf("%le",&a);
答案:D)
解析:选项A)错,因为语句中使用的是变量a而不是变量a的地址。选项B)错,因为double型应该用%lf或%le格式。选项C)错,句末没有加分号。
2阅读以下程序:
#include
main()
{
charstr[10];
scanf("%s",str);
printf("%s\n",str);
}
运行上面的程序,输入字符串HOWDOYOUDO,则程序的输出结果是()。
A)HOWDOYOUDOB)HOW
C)HOWDOYOUDOD)howdoyoudo
答案:B)
解析:因为当从键盘输入字符串HOWDOYOUDO时,由于scanf()函数输入时遇到空格结束,只将HOW3个字符送到字符数组str中,并在其后自动加上结束符′\0′。
3合法的C语言赋值语句是()。
A)a=b=58B)k=int(a+b);
C)a=58,b=58D)--i;
答案:D)
解析:选项A)是一个合法的赋值表达式,但不是C语言的赋值语句,因为最后没有构成语句所必要的分号。选项B)中虽然最后有一个分号,但赋值号右边的强制类型转换符是错误的,应该写成(int)(a+b),当使用强制类型转换符时,类型名一定要用圆括号括起来。选项C)是一个逗号表达式,但最后没有分号,因此不是语句。选项D)是一个由自减运算符构成的赋值表达式,且用分号结束,因此这是一个合法的赋值语句。
4若变量已正确定义,以下程序段:
x=516894;
printf("%f\n",(int)(x1000+05)/(float)1000);
的输出结果是()。
A)输出格式说明与输出项不匹配,输出无定值
B)5170000
C)5168000
D)5169000
答案:D)
解析:由输出语句看,输出项是一个算术表达式,分子和分母部分都采用了强制类型转换,分子部分得的是整型数,分母部分得的是实型数。按规则,若算术运算符两边类型不一致,一个是整型一个是实型时,整型数将首先转换成实型数,然后进行计算;因此,输出项是一个实型数,输出格式说明与输出项的值是匹配的,选项A)的说法不成立。接着应当计算输出项的值,输出结果应当是5169000。
5若有以下程序段:
inta=0,b=0,c=0;
c=(a-=a-5),(a=b,b+3);
printf("%d,%d,%d\n",a,b,c);
其输出结果是()。
A)3,0,-10B)0,0,5C)-10,3,-10D)3,0,3
答案:B)
解析:由定义可见,a、b、c都是整型变量,且都赋了初值0。第二行的语句由逗号表达式组成,其中第一个:c=(a-=a-5)是赋值表达式,此赋值表达式等同于:c=(a=a-(a-5)),因为a的初值为0,它首先给a赋5,然后a把值赋给c,所以c的值为5。程序最后需要输出a的值,在语句c=(a-=a-5),(a=b,b+3);中,a的值在(a=b,b+3)中通过a=b被重新赋予0,因此,a最终的值为0。程序最后还需输出b的值,但它的值与第二行的赋值语句无关,取决于初值0。在输出语句中,每个格式说明之间都有一个逗号,应当原样输出,所以输出的结果应该如选项B)所示。
6若有以下程序段:
#include
main()
{
inta=2,b=5;
printf("a=%%d,b=%%d\n",a,b);
}
其输出结果是()。
A)a=%2,b=%5B)a=2,b=5
C)a=%%d,b=%%dD)a=%d,b=%d
答案:D)
解析:为了解答本题,首先需要了解C编译程序将如何解释格式串中的%%d。C语言规定,连续的两个百分号(%%)将按一个%字符处理,输出一个%号,所以%%d被解释为输出两个字符:%和d。根据以上分析,在格式串中没有用于整型数输出的格式说明符“%d”,因此也就无法对整型变量a和b进行输出,格式串中的所有内容将按原样输出。
7以下程序段:
floata=31415;
printf("|%60f|\n",a);
其输出结果是()。
A)|31415|B)|30|C)|3|D)|3|
答案:C)
解析:在输出格式串中,最前的|号和\n之前的|号,按规定照原样输出。当在输出格式中指定输出的宽度时,输出的数据在指定宽度内右对齐。对于实型数,当指定小数位为0时,输出的实型数据将略去小数点和小数点后的小数。
8以下程序段的输出结果是()。
floata=57666;
printf("%0102f\n",a);
A)000005766B)5766C)000005767D)5757
答案:C)
解析:在输出格式串中,最前的号和\n之前的号,按规定照原样输出。输出格式%092f和%102f有以下共同之处:(1)输出时,数据占有相同的宽度(10位);(2)输出时,小数点后的小数占两位。若输出数据的小数多于两位,对小数点后的第3位进行四舍五入处理。输出格式%0102f和%102f的不同之处是:输出格式%0102f中,在宽度说明10之前有一个0,其作用是:在数据前面的多余空格处填以数字0。例如,若a中的数据是57666,用%102f格式输出时,输出结果是:]]]]]5767,此处]代表一个空格;而用%0102f格式输出时,输出结果是:000005767,空格用0代替。
9若变量c定义为float类型,当从终端输入2831900后按回车键,能给变量c赋以28319的输入语句是()。
A)scanf("%f",c);B)scanf("%84f",&c);
C)scanf("%62f",&c);D)scanf("%8f",&c);
答案:D)
解析:选项A)中,变量c的前面没有求地址运算符&,因此是错误的。选项D)中,在%和格式字符f之间用8指定了数据所占的宽度,而输入的数据也占8位,因此可以正确输入。选项B)和选项C)中,在%和格式字符f之间分别用84和62企图指定输入数据的宽度,这是错误的:C语言规定,在输入时不可以在格式说明中对实型数指定小数位的宽度,只可以用一个整数来指定输入数据所占的总的宽度。
10若有以下定义语句:
intu=010,v=0x10,w=10;
printf("%d,%d,%d\n",u,v,w);
则输出结果是()。
A)8,16,10B)10,10,10
C)8,8,10D)8,10,10
答案:A)
解析:本题考查两个知识点:一是整形常量的不同表示法;二是格式输出函数printf()的字符格式。题中“intu=010,v=0x10,w=10;”语句中的变量u、v、w分别是八进制数、十六进制数和十进制数表示法,对应着十进制数的8、16和10。而printf()函数中的“%d”是格式字符,表示以十进制整数形式输出输出项。
11下面程序的输出是()。
#include
main()
{
intk=11;
printf("%d,%o,%x\n",k,k,k);
}
A)11,12,11B)11,13,13
C)11,013,0xbD)11,13,b
答案:D)
解析:根据本章所学的格式符,可知本题为以带符号十进制数、八进制数及十六进制数的形式输出整数。在C语言中,常用前缀0表示八进制数,用前缀0X或0x表示十六进制数,但在用printf()函数输出时,并不输出前缀。
12指出下列哪一个选项的程序是错误的()。
A)#include
main()
{
intx,y,z;
x=0;y=x+1;
z=x+y;
}B)#include
main()
{
intx,y,z;
x=0,y=x+1;
z=x+y;
}C)#include
main()
{
intx,y,z;
x=0;y=x+1,
z=x+y;
}D)#include
main()
{
intx,y,z;
x=0,y=x+1;
z=x+y,
}答案:D)
解析:在选项A)中的语句没有一条是错误的。选项B)和选项C)中都有一个逗号表达式,在选项B)中是:x=0,y=x+1;在选项C)中是:y=x+1,z=x+y;所以选项B)和选项C)中也没有错误。选项D)中的最后一条语句是以逗号结束的,而C语言中不能用逗号作为一个语句的结束标志,每一条语句最后应该是分号,所以选项D)中的程序是错误的。
二、填空题
1变量i、j、k已定义为int类型并有初值0,用以下语句进行输入:
scanf("%d",&i);scanf("%d",&j);scanf("%d",&k);
当执行以上输入语句,从键盘输入(代表回车键):
123
则变量i、j、k的值分别是、、。
答案:1200
解析:在执行以上第一个输入语句时,首先为变量i读入数据。当读入12时遇到点号(),因为i是整型变量,则视该点号为非法数据,这时读入操作自动结束,把12赋给变量i。未读入的点号留在缓冲区作为下一次输入操作的输入数据。当执行第二个输入语句时,系统将为变量j读入数据,首先遇到的就是点号,因为j也是整型变量,因此也视该点号为非法数据,读入操作自动结束,没有读入数据给变量j,j保持原有数据不变(为初值0)。执行第三个输入语句的情况与第二个输入语句相同,变量k维持原有数据不变。
2复合语句在语法上被认为是。空语句的形式是。
答案:一条语句分号(或;)
解析:按C语法规定,在程序中,用一对花括号把若干语句括起来称为复合语句;复合语句在语法上被认为是一条语句。空语句的形式是:一个分号(;)。它由一个单独的分号构成,程序遇到空语句时,不产生任何动作。
3C语句句尾用结束。
答案:分号“;”
解析:相关内容请参考本章讲解。
4以下程序段:
intk;floata;doublex;
scanf("%d%f%lf",&k,&a,&x);
printf("k=%d,a=%f,x=%f\n",k,a,x);
要求通过scanf语句给变量赋值,然后输出变量的值。写出运行时给k输入100,给a输入2582,给x输入189234时的3种可能的输入形式,,。
答案:(1)1002582189234
(2)100
2582
189234
(3)1002582189234
解析:当调用scanf()函数从键盘输入数据时,输入的数据之间用间隔符隔开。合法的间隔符可以是空格符、制表符和回车符。说明:只要在输入数据之间使用如上所述的合格的分隔符即可。
5以下程序段的输出结果是。
intx=0177;
printf("x=%3d,x=%6d,x=%6o,x=%6x,x=%6u\n",x,x,x,x,x);
答案:x=127,x=]]]127,x=]]]177,x=]]]]7f,x=]]]]127
解析:变量x为int类型,所赋初值为八进制数0177(在C语言中,八进制数都用数字0开头)。对应的十进制数是127。在printf语句中,x以不同的形式输出5次,分别用宽度为3的十进制数形式、宽度为6的十进制数形式、宽度为6的八进制数形式、宽度为6的十六进制数形式、宽度为6的无符号十进制数形式进行输出。格式串中的若干“x=”和逗号将按原样输出。八进制数0177,转换成十进制数是127,转换成十六进制数是7f,转换成无符号十进制数也是127。
6运行如下程序:
#include
main()
{
inta,b,c;
scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
}
运行时,输入3、4、5,输出的值为。
答案:3,4,5
解析:程序中,“&a”是指在内存中的地址,“&”是取地址运算符。该scanf()函数的作用是:将接收到的数据依次存入a、b、c在内存中相应的存储单元中。
3.7同步练习
一、选择题
1下面程序的输出结果是()。
#include
main()
{
intx=5,y=3;
printf("%d\n",y=x/y);
}
A)0B)1C)3D)不确定的值
2若变量已正确定义,下面程序段的输出结果是()。
x=5238794;
printf("%f\n",(int)(x1000+05)/(float)1000);
A)5239000B)输出格式说明与输出项不匹配,输出无定值
C)5238000D)524
3下面语句:
printf("|%8.5f|\n",3461.45);
的输出结果是()。
A)|61.45000|B)|3461.450|C)|3461.45000|D)|3461.4500|
4与数学公式|cos(x)|等价的C语言表达式是(),假定其中的x的单位是度数且不考虑π值的精度。
A)sqrt(cos(x))B)sqrt(abs(cos(x314/180)))
C)sqrt(abs(cos(x(/180)))D)sqrt(fabs(cos(x314/180)))
5下面的程序()。
#include
main()
{
intx=3,y=0,z=0;
if(x=y+z)printf("");
elseprintf("####");
}
A)有语法错误不能通过编译
B)输出
C)可以通过编译,但是不能通过连接,因而不能运行
D)输出####
6执行下面程序中的输出语句后,a的值是()。
#include
main()
{
inta;
printf("%d\n",(a=35,a4,a+5));
}
A)65B)20C)15D)10
7以下程序不用第三个变量,实现将两个数进行对调的操作。请填空()。
#include
main()
{
inta,b;
scanf("%d%d",&a,&b);
printf("a=%db=%d",a,b);
a=a+b;b=a-b;a=;
printf("a=%db=%d\n",a,b);
}
A)a+bB)a-bC)baD)a/b
8以下程序的输出结果为()。
#include
main()
{
intm=7,n=4;
floata=384,b=64,x;
x=m/2+na/b+1/2;
printf("%f\n",x);
}
A)27000000B)27500000C)28000000D)28500000
9若变量都已正确说明,则以下程序段:
a=2;
b=3;
printf(a>b?"a=%d";"###b=%d",a,b);
A)没有正确的输出格式控制B)输出为:a=2
C)输出为:###b=2D)输出为:a=2###b=2
10若已定义inta=256;,执行语句printf("%x",a);的结果是()。
A)100B)256C)ffeD)ff
11执行下列程序时输入1234567,程序的运行结果为()。
#include
main()
{
intx,y;
scanf("%2d%2ld",&x,&y);
printf("%d\n",x+y);
}
A)17B)46C)15D)9
12已知chara;intb;floatc;doubled;,则表达式ab+c-d结果为()型。
A)doubleB)intC)floatD)char
13已知inta,b;,用语句scanf("%d%d",&a,&b);输入a,b的值时,不能作为输入数据分隔符的是()。
A),B)空格C)回车D)【Tab】键
14语句printf("%d",(a=2)&&(b=-2));的输出结果是()。
A)无输出B)结果不确定C)-1D)1
15下述程序的输出结果是()。
#include
main()
{printf("%f",2.5+17%2/4);
}
A)2.50000B)2.750000C)3.375000D)3.000000
16根据定义和数据的输入方式,输入语句的正确形式为()。
已有定义:floatf1,f2;
数据的输入方式:4.52
3.5
A)scanf("%f,%f",&f1,&f2);B)scanf("%f%f",&f1,&f2);
C)scanf("%3.2f%2.1f",&f1,&f2);D)scanf("%3.2f,%2.1f",&f1,&f2);
二、填空题
1下面程序的输出是。
#include
main()
{
inti=-200,j=25;
printf("%d,%d",i,j);
printf("i=%d,j=%d\n",i,j);
printf("i=%d\nj=%d\n",i,j);
}
2使用强制转换方法将正整数转换成字符。本题程序如下:
#include
main()
{
charc;inti;
printf("输入一个正整数(小于255):");
scanf("%d",&i);
c=(char)i;
printf("%c的ASCII码为%d\n",c,i);
}
本程序的执行结果为。
3直接使用printf()的格式符输出八进制数和十六进制数。本题程序如下:
#include
main()
{
inti;
printf("输入一个整数:");
scanf("%d",&i);
printf("%d(10)%o(8)\n",i,i);
printf("%d(10)%x(16)\n",i,i);
}
输入100的执行结果为和。
4本题程序如下:
#include
main()
{
inti=560,h,m;
h=i/60;/计算小时数/
m=i-60h;/计算余下的分钟/
printf("%d分钟%d小时%d分钟\n",i,h,m);
}
本程序的执行结果为。
5以下程序的输出结果为。
#include
main()
{printf("%f,%4.3f\n",3.14,3.1415);}
6已有定义intd=-2;,执行以下语句后的输出结果是。
printf("d(1)=%dd(2)=%3dd(3)=%-3d\n",d,d,d);
printf("d(4)=%xd(5)=%6xd(6)=%-6x\n",d,d,d);
7在scanf()函数调用语句中,可以在格式字符和%号之间加上一个星号,它的作用是;当输入以下数据时:10]]20]]30]]40(此处]代表空格),下面语句的执行结果是。
inta1,a2,a3;
scanf("%d%d%d%d",&a1,&a2,&a3);
printf("%d%d%d",a1,a2,a3);
8执行以下程序时,若从第一列开始输入数据,为使变量a=3,b=7,x=8.5,y=71.82,c1=′A′,c2=′a′,正确的数据输入形式是。
#include
main()
{inta,b;floatx,y;charc1,c2;
scanf("a=%db=%d",&a,&b);
scanf("x=%fy=%f",&x,&y);
scanf("c1=%cc2=%c",&c1,&c2);
printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c",a,b,x,y,c1,c2);
}
3.8同步练习答案
一、选择题
1B)2A)3C)4D)5D)6B)7B)8A)
9A)10A)11B)12A)13A)14D)15A)16B)
二、填空题
1.-200,25i=-200,j=25
i=-200
j=25
2.输入一个正整数(小于255):97a的ASCII码为97
3.输入一个整数:100100(10)144(8)
100(10)64(16)
4.560分钟9小时20分钟
5.3.140000,3.142
6.d(1)=-2d(2)=]-2d(3)=-2]
d(4)=fffed(5)=]]fffed(6)=fffe]](此处]代表空格)
7.跳过对应的输入数据
将把10赋给a1,跳过20,把30赋给a2,把40赋给a3(103040)
8.a=3]b=7x=8.5]y=71.82c1=A]c2=a(此处]代表空格)



C语言概述选择结构

考核知识点
if语句实现选择结构
用switch语句实现多分支选择结构
选择结构的嵌套
goto语句和语句标号的使用
重要考点提示
根据对历年的试卷分析可知,本章考核内容约为10%。主要考核以下几个方面:
选择语句的简单操作
if语句的嵌套操作
switch语句的使用
4.1关系运算符和关系表达式
关系运算是逻辑运算中较简单的一种。所谓“关系运算”其实就是“比较运算”,对两个值进行比较,判断其比较后的结果是否符合指定条件,从而执行不同的程序段。
考点1关系运算符及其优先次序
C语言提供了6种关系运算符,见表41。
表41关系运算符
关系运算符名称=大于或等于>大于==等于!=不等于
由两个字符组成的运算符之间不可以加空格,关系运算符都是双目运算符。
(1)结合性:自左向右。
(2)优先次序:前4种关系运算符(=,>)的优先级别相同,后两种(==,!=)优先级相同,且前4种优先级高于后两种;关系运算符的优先级低于算术运算符,高于赋值运算符。
考点2关系表达式
由关系运算符连接而成的表达式(可以是算术表达式、关系表达式或其他表达式)称为关系表达式。
当关系运算符两边值的类型不一致时,若一边是整型,一边是实型,系统将自动把整型数转化为实型数,然后再进行比较。
4.2逻辑运算符和逻辑表达式
考点3逻辑运算符及其优先级
C语言提供了3种逻辑运算符,见表42。
表42逻辑运算符
符号名称&&逻辑与||逻辑或!逻辑非“&&”和“||”是双目运算符,要求要有两个操作数,而“!”是单目运算符,只要求有一个操作数即可。以上逻辑运算符的优先级是:“!”(逻辑非)级别最高,其次是“&&”(逻辑与),“||”(逻辑或)级别最低,逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。
即:!(逻辑非)>算术运算符>关系运算符>“&&”>“||”>赋值运算符。
考点4逻辑表达式
逻辑表达式由逻辑运算符和运算对象组成,其中,参与逻辑运算的对象可以是一个具体的值,还可以是C语言中任意合法的表达式,逻辑表达式的运算结果为1(真)或者为0(假)。若a=5,则!a的值为0,因为a的值为5(是非0值),被认做“真”,对它进行“非”运算后,结果为“假”,即结果为0。当A和B的值结合方式不同时,各种逻辑运算所得到的结果是不同的,见表43。
表43逻辑运算表
AB!A!BA&&BA||B110011100101011001001100值得注意的是:在数学中,关系式0(1)x&&y&&z,只有当x为真(非0)时,才需要判别y的值;只有x和y都为真时,才需要去判别z的值;只要x为假就不必判别y和z,整个表达式的值为0。
(2)x||y||z,只要x的值为真(非零),就不必判别y和z的值,整个表达式的值为1,只有x的值为假,才需要判别y的值,只有x和y的值同时为假才需要判别z的值,因此,如有以下逻辑表达式(m=x>y)&&(n=c>d),其中x=1,y=2,c=3,d=4,若m和n原值为1,由于“x>y”的值为0,因此m=0,而不执行“n=c>d”,所以n的值不是0而是原值1。读者要注意这一点。
4.3if语句和用if语句构成的选择结构
if语句用来对所给定的条件进行判定,判断其表达式的值是否满足某种条件,并根据判定的结果(真或假)决定执行给出的两种操作中的哪一种。
考点5if语句的几种形式
(1)if(表达式)语句
例如:
if(a>b)
printf("Theanswerisright!\n");
其中,if是C语言的关键字,a>b是条件判断表达式。表达式两侧的括号不可少,并且只能是圆括号,不能用其他括号替代。紧跟着的是一条输出语句,称为if子句,如果在if子句中需要多个语句,则应该使用大括号({})把一组语句括起来构成复合语句,这样在语法上满足“一条语句”的要求。
(2)if(表达式)
语句1
else语句2
例如:
if(a>b)printf("Theanswerisright\n");
elseprintf("Theansweriswrong\n");
(3)if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3

elseif(表达式m)语句m
else语句n
“语句1”是if子句,“语句2…语句m”是else子句。这些子句在语法上要求是一条语句,但需要执行多条语句时,则应该使用花括号({})把这些语句括起来组成复合语句。
else不能独立成为一条语句,它只是if语句的一部分,不允许单独出现在程序中。else必须与if配对,共同组成if…else语句。
考点6if语句的嵌套
在if语句中又包含一个或多个if语句结构,称为if语句的嵌套,一般形式如下:
if()
if()语句1
else语句2
else
if()语句3
else语句4
应当注意:ulse总是与它上面的最近的没有与else配对的if配对。
考点7条件运算符构成的选择结构
有如下语句:
if(xmil=x;/求翝数中较小的一个/
elsemin=y;
可谠勇min=(x优先级:条件运算符高于赋值运算符,但低于逻辑运算符、关系运算符和耍术运算符。
4.4switch语句禾鏾to语句
考点8{witch语句
switbh隅句是C语言提供的多分支选择语句,用来实现多分支选择结构。它的一般形式如下:
switch(表达式)
{
case常量表达式1:语句1
case常量表达式2愫语句2



c!se(常揽表达陆n:语朵n
default:语句n+1
}
郾明:
(1)switch是关键字,switgh后面用花括号括起来的部分是switch语句体。
(2)switch后面括号内的“表达式”,可以是C语言中任意合法表达式,但表达式两侧的括号不能省略。
(3)casm也是关键字,与其撼面的常量表达式合称case语句标号,常量表达式的类型必须与switch后面的鬼达冉的类信相匹配,且各case语句标号的值各不相同,不能峁蝗范–)-1D)1
15下述程序的输出结果是()。
#include
main()
{printf("%f",2.5+17%2/4);
}
A)2.50000B)2.750000C)3.375000D)3.000000
16根据定义和数据的输入方式,输入语句的正确形式为()。
已有定义:floatf1,f2;
数据的输入方式:4.52
3.5
A)scanf("%f,%f",&f1,&f2);B)scanf("%f%f",&f1,&f2);
C)scanf("%3.2f%2.1f",&f1,&f2);D)scanf("%3.2f,%2.1f",&f1,&f2);
二、填空题
1下面程序的输出是。
#include
main()
{
inti=-200,j=25;
printf("%d,%d",i,j);
printf("i=%d,j=%d\n",i,j);
printf("i=%d\nj=%d\n",i,j);
}
2使用强制转换方法将正整数转换成字符。本题程序如下:
#include
main()
{
charc;inti;
printf("输入一个正整数(小于255):");
scanf("%d",&i);
c=(char)i;
printf("%c的ASCII码为%d\n",c,i);
}
本程序的执行结果为。
3直接使用printf()的格式符printf("%d",a);,是正确的。选项B)中的if(&&);后面的分号表示它是一条空语句,不要误认为是if语句的结束标志,所以这种写法是正确的,而&&是运算符不能作为表达式,所以选项B)是错误的。选项D)也是用了一条空语句,之后用花括号括起来的是复合语句(虽然只有一条语句),选项D)是正确的。选项C)中的1表示条件为真时成立,执行a=m;,条件为假时,执行语句a=n;,很明显选项C)也是正确的。
2读下列程序:
#include
main()
{
floata,b,t;
scanf("%f,%f",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%52f,%52f",a,b);
}
运行时从键盘输入38和-34,则正确的输出结果是()。
A)-340,-380B)-340,380
C)-34,38D)380,-340
答案:B)
解析:此程序是输入两个实数,按代数值由小到大次序输出这两个数。
3读下列程序:
#include
main()
{
intx,y;
scanf("%d",&x);
y=0;
if(x>=0)
{if(x>0)y=1;}
elsey=-1;
printf("%d",y);}
当从键盘输入32时,程序输出结果为()。
A)0B)-1C)1D)不确定值
答案:C)
解析:此程序可以化为数学公式:
y=-1(x0(x=0)
1(x>0)
当输入的数小于零时,输出值为-1;当输入的数等于零时,输出值为0;当输入的数大于零时,输出的数等于1。
4对下述程序,()是正确的判断。
#include
main()
{
intx,y;
scanf("%d,%d",&x,&y);
if(x>y)
x=y;y=x;
else
x++;y++;
printf("%d,%d",x,y);
}
A)有语法错误,不能通过编译B)若输入数据3和4,则输出4和5
C)若输入数据4和3,则输出3和4D)若输入数据4和3,则输出4和4
答案:A)
解析:if语句可称为条件语句或分支语句,其基本形式只有两种:
if(表达式)语句
if(表达式)语句1else语句2
由于在表达式为真或假的时候所执行的语句的特殊性,可以派生出一个特殊的形式,如阶梯式的条件语句等。if语句中else与if的搭配关系为:复杂的if语句中可能有许多个if和else。其配对的原则是:一个else应与其之前距离最近且没有与其他else配对的if搭配使用。不管if语句中的条件为真还是假,只能执行一个语句,而程序中的x=y;y=x;违反了这一点,故选项A)是正确的判断。改正的办法是将多个语句合成一个复合语句。题中的其他选项是在假定x=y;y=x;为复合语句的基础上产生的。
5以下程序的输出结果是()。
#include
main()
{
intx=1,y=0,a=0,b=0;
switch(x)
{
case1:
switch(y)
{
case0:a++;break;
case1:b++;break;
}
case2:
a++;b++;break;
case3:
a++;b++;
}
printf("\na=%d,b=%d",a,b);
}
A)a=1,b=0B)a=2,b=1C)a=1,b=1D)a=2,b=2
答案:B)
解析:这是嵌套形式的switch语句,因为break结构影响较大,而此程序中的第一个case后没有break语句。程序执行时,x=1,执行内嵌的switch语句,因y=0,执行“a++;”,使变量a的值为1并终止内层switch结构,回到外层。程序继续执行“case2:”后面的语句“a++;b++;”,这使变量a、b的值分别为2和1,外层switch语句结束。
6为表示关系:x≥y≥z,应使用的C语言表达式是()。
A)(x>=y)&&(y>=z)B)(x>=y)AND(y>=z)
C)(x>=y>=z)D)(x>=y)&(y>=z)
答案:A)
解析:选项D)中,表达式(x>=y)&(y>=z)中的运算符“&”是一个位运算符,不是逻辑运算符,因此不可能构成一个逻辑表达式。选项B)中,表达式(x>=y)AND(y>=z)中的运算符“AND”不是C语言中的运算符,因此这不是一个合法的C语言表达式。选项C)中,(x>=y>=z)在C语言中是合法的表达式,但在逻辑上,它不能代表x≥y≥z的关系。
7以下程序的输出结果是()。
#include
main()
{
inta=2,b=-1,c=2;
if(aif(belsec+=1;
printf("%d\n",c);
}
A)0B)1C)2D)3
答案:C)
解析:本题涉及如何正确理解if…else语句的语法。按C语言语法规定,else子句总是与前面最近的不带else的if语句相结合,与书写格式无关。本题中的if语句是一个if…else语句,else应当与内嵌的if配对,第一个if语句其实并不含有else子句。如果按正确的缩进格式重新写出以上程序段就更易理解。首先执行if(a8以下程序的输出结果是()。
#include
main()
{
intw=4,x=3,y=2,z=1;
printf("%d\n",(w}
A)1B)2C)3D)4
答案:A)
解析:本题的printf语句的输出项是一个复合的条件表达式。为了清晰起见,可用括号将此表达式中的各个运算项括起来:(w9以下程序的运行结果是()。
#include
main()
{
intk=2;
switch(k)
{
case1:printf("%d\n",k++);
break;
case2:printf("%d",k++);
case3:printf("%d\n",k++);
break;
case4:printf("%d\n",k++);
default:printf("Full!\n");
}
}
A)13B)23C)22D)32
答案:B)
解析:k=2,执行case2:分支,k++返回2,此时k=3,屏幕输出2,后跟一空格。由于没有break语句,继续执行case3:分支,k++返回3,此时k=4,屏幕输出3。由于有break语句,退出switch语句。
二、填空题
1在C语言中,关系运算符的优先级别是。
答案:,=,==,!=
解析:关系运算符,=的优先级别相同;==,!=的优先级别相同;前4种的优先级别高于后两种。
2在C语言中,逻辑运算符的优先级别是,,。
答案:!&&||
解析:C语言中的逻辑运算符按由高到低的优先级别是:!(逻辑非)、&&(逻辑与)、||(逻辑或)。
3请写出以下程序的输出结果。
#include
main()
{
inta=100;
if(a>100)
printf("%d\n",a>100);
else
printf("%d\n",a}
答案:1
解析:由于a已在定义语句中赋了初值100,所以接下来if语句中关系表达式a>100的值是0,不执行其后的输出语句,而执行else子句中的printf语句,它的输出项是a4请写出与以下表达式等价的表达式,。
(1)!(x>0)(2)!0
答案:x解析:表达式!(x>0)的含义是,只要x的值大于0,此表达式就等于0;x的值小于等于0,此表达式就等于1。表达式!0的值永远为1,所以可以用1来代替!0。
5当a=1,b=2,c=3时,以下语句执行后,a、b、c中的值分别为、、。
if(a>c)
b=a;a=c;c=b;
答案:322
解析:因为b=a;a=c;c=b;并没有用“{}”括起来,因此,只有b=a;是if语句的子句,其他的赋值语句是独立的语句,不从属于if语句。a中的值小于c中的值,因此不执行if后的b=a;,将直接执行a=c;c=b;。结果,a中的值变成3,c中的值变成2,b中的值不变,仍是2。
6若变量已正确定义,以下语句段的输出结果是。
x=0;y=2;z=3;
switch(x)
{
case0:switch(y==2)
{
case1:printf("");break;
case2:printf("%");break;
}
case1:switch(z)
{
case1:printf("$");
case2:printf("");break;
default:printf("#");
}
}
答案:#
解析:由于x的值为0,首先执行外层case0标号中的switch语句,执行完此switch语句后,没有遇到break语句,因此就接着执行外层case1标号中的switch语句,最后退出外层的switch语句。执行外层case0标号中的switch语句时,表达式y==2的值为1,接着执行该switch语句的case1标号中的printf,输出一个号,然后遇到接着的break;语句,结束该switch语句。执行外层case1标号中的switch语句。在外层case1标号的switch语句中,括号中z的值是3,没有对应的case标号,因此执行default标号后的printf语句,输出一个#号,最后结束外层的switch语句。
4.6同步练习
一、选择题
1下列程序的运行结果是()。
#include
main()
{inta=2,c=5;
printf("a=%d,b=%d\n",a,c);
}
A)a=%2,b=%5B)a=2,b=5
C)a=d,b=dD)a=%d,b=%d
2语句printf("a\bre\′hi\′y\\\\bou\n");的输出结果是()。
A)a\bre\′hi\′y\\\bouB)a\bre\′hi\′y\bou
C)re′hi′youD)abre′hi′y\bou
(说明:′\b′是退格符)
3如下程序的输出结果是()。
#include
main()
{intx=1,a=0,b=0;
switch(x)
{
case0:b++;
case1:a++;
case2:a++;b++;
}
printf("a=%d,b=%d\n",a,b);
}
A)a=2,b=1B)a=1,b=1C)a=1,b=0D)a=2,b=2
4如下程序的输出结果是()。
#include
main()
{floatx=20,y;
if(xelseif(xelsey=10;
printf("%f\n",y);
}
A)0000000B)0250000C)0500000D)1000000
5如下程序的输出结果是()。
#include
main()
{
inta=12,b=5,c=-3;
if(a>b)
if(belsec++;
printf("%d\n",c);
}
A)0B)1C)-2D)-3
6阅读以下程序:
#include
main()
{intx;
scanf("%d",&x);
if(x--elseprintf("%d",x++);
}
程序运行后,如果从键盘输入5,则输出结果是()。
A)3B)4C)5D)6
7以下程序的输出结果是()。
#include
main()
{inta=15,b=21,m=0;
switch(a%3)
{case0:m++;break;
case1:m++;
switch(b%2)
{default:m++;
case0:m++;break;
}
}
printf("%d\n",m);
}
A)1B)2C)3D)4
8下面的程序()。
#include
main()
{intx=3,y=0,z=0;
if(x=y+z)printf("");
elseprintf("####");
}
A)有语法错误不能通过编译
B)输出
C)可以通过编译,但是不能通过连接,因而不能运行
D)输出####
9两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是()。
#include
main()
{intx;
scanf("%d",&x);
if(x++>5)printf("%d",x);
elseprintf("%d\n",x--);}
A)7和5B)6和3C)7和4D)6和4
10以下程序的输出结果是()。
#include
main()
{inta=-1,b=4,k;
k=(++aprintf("%d%d%d\n",k,a,b);}
A)104B)103C)003D)004
11能正确表示a≥10或a≤0的关系表达式是()。
A)a>=10ora=10|aC)a>=10&&a=10||a12假定所有变量均已正确说明,下列程序段运行后x的值是()。
a=b=c=0;x=35;
if(!a)x--;
elseif(b);
if(c)x=3;
elsex=4;
A)34B)4C)35D)3
13表示关系X≤Y≤Z的C语言表达式为()。
A)(XC)(X14如下程序的输出结果为()。
#include
main()
{inta,b,c=246;
a=c/100%9;
b=(-1)&&(-1);
printf("%d,%d\n",a,b);
}
A)2,1B)3,2C)4,3D)2,-1
15当a=1、b=3、c=5、d=5时,执行下面的程序段后,x的值为()。
if(aif(celse
if(aif(belsex=3;
elsex=6;
elsex=7;
A)1B)2C)3D)6
16能正确表示a和b同时为正或同时为负的逻辑表达式是()。
A)(a>=0||b>=0)&&(a=0&&b>=0)&&(aC)(a+b>0)&&(a+b0
17以下程序的输出结果是()。
#include
main()
{inta=-1,b=1,k;
if((++aprintf("%d%d\n",a,b);
else
printf("%d%d\n",b,a);
}
A)-11B)01C)10D)00
18下列关于switch语句和break语句的结论中,正确的是()。
A)break语句是switch语句中的一部分
B)在switch语句中可以根据需要使用或不使用break语句
C)在switch语句中必须使用break语句
D)break语句只能用于switch语句中
19设有说明语句“inta=1,b=0;”,则执行以下语句后,输出为()。
switch(a)
{case1:
switch(b)
{case0:printf("0");break;
case1:printf("1");break;
}
case2:printf("2");break;
}
A)0B)02
C)012D)有语法错误
20以下关于运算符优先顺序的描述中正确的是()。
A)关系运算符B)逻辑与运算符C)赋值运算符D)算术运算符21为了避免在嵌套的条件语句if…else中产生二义性,C语言规定:else子句总是与()配对。
A)缩排位置相同的ifB)其之前最近的if
C)其之后最近的ifD)同一行上的if
二、填空题
1若有定义:inta=10,b=9,c=8;,接着顺序执行下列语句后,变量b中的值是。
c=(a-=(b-5));
c=(a%11)+(b=3);
2表示“整数x的绝对值大于5”时值为“真”的C语言表达式是。
3下列程序的输出结果是1600,请填空。
#include
main()
{
inta=9,b=2;
floatx=,y=11,z;
z=a/2+bx/y+1/2;
printf("%52f\n",z);
}
4若从键盘输入58,则以下程序输出的结果是。
#include
main()
{inta;
scanf("%d",&a);
if(a>50)printf("%d",a);
if(a>40)printf("%d",a);
if(a>30)printf("%d",a);
}
5以下程序输出的结果是。
#include
main()
{inta=5,b=4,c=3,d;
d=(a>b>c);
printf("%d\n",d);
}
6以下程序运行后的输出结果是。
#include
main()
{intx=10,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf("%d,%d\n",x,y);
}
7设a、b、c为整型数,且a=2,b=3,c=4,则执行完语句a=16+(b++)-(++c);后,a的值是。
8209若inti=10;,则执行下列程序后,变量i的正确结果是。
switch(i)
{case9:i+=1;
case10:i+=1;
case11:i+=1;
default:i+=1;
}
10以下程序的输出结果是。
#include
main()
{intx=2,y=-1,z=2;
if(xif(yelsez+=1;
printf("%d\n",z);
}
11若运行时输入12,则以下程序的运行结果是。
#include
main()
{intx,y;
scanf("%d",&x);
y=x>12?x+10:x-12;
printf("%d\n",y);
}
12设x、y、z均为int型变量,请写出描述“x或y中至少有一个小于z”的表达式。
13已知A=7.5,B=2,C=3.6,表达式A>B&&C>A||AB的值是。
4.7同步练习答案
一、选择题
1B)2C)3A)4C)5C)6B)7A)8D)
9A)10D)11D)12B)13A)14A)15B)16D)
17C)18B)19B)20C)21B)
二、填空题
1.3
2.x>5||x3.66
4.585858
5.0
6.20,0
7.28
8.((209.13
10.2
11.0
12.x13.0







---------------

中国手机Txt电子书



Txt66.com



本站可提供小说在线阅读,同时可提供TXT格式下载

声明:本电子书仅供读者预览,请在下载24小时内删除,不得用作商业用途。如果喜欢请购买正版图书

献花(0)
+1
(本文系心语微言首藏)