C详细答案复习题c.docx
- 文档编号:26765730
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:19
- 大小:42.15KB
C详细答案复习题c.docx
《C详细答案复习题c.docx》由会员分享,可在线阅读,更多相关《C详细答案复习题c.docx(19页珍藏版)》请在冰豆网上搜索。
C详细答案复习题c
第3章运算符和表达式
丰富的运算符可使表达式方便、简捷。
初学者一下掌握这么多操作符会有压力。
可通过写或计算表达式的练习,以及各章程序实例中出现的表达式,进一步熟悉运算符。
3.1表达式的基本概念
对数据进行各种运算的符号为运算符,参与运算的数据为操作数。
表达式构成:
常量、变量、有返回值的函数调用是表达式,表达式加圆括号、或用运算符作正确连接后也是表达式。
圆括号左、右括号个数要相同,多层括号时内层括号中的运算优先;整个表达式必须写在同一行上。
a·x3+b·x2+c·x+d写作
a*x*x*x+b*x*x+c*x+d或((a*x+b)*x+c)*x+d;
写作1/(1+1/(1+x));等等。
C运算符:
算术、关系、逻辑、条件、赋值、逗号运算符,等等。
根据参与运算的操作数个数,运算符可分为单目、双目以及三目运算符。
两个操作数的运算符是双目运算符,“单目运算符”只有一个操作数。
三目运算符是C语言所特有的,它有三个操作数。
不同运算符参与运算时有优先级问题。
如先乘除、后加减。
同级运算一般是从左向右进行。
特例如赋值“x=y=3”,先计算y=3、再计算x=y。
特例将特别指出,一般按缺省。
主要介绍算术(包括自增自减)、关系、逻辑、赋值、逗号运算符,以及由这些运算符构成的各类表达式。
3.2算术运算符与算术表达式
内容:
算术运算符及其功能,算术表达式,优先级、运算时的类型转换规则。
3.2.1算术运算符
1.算术运算符
C的算术运算符有:
+-*/%(取余)
其中“-”可作单目运算符,如-5,表达式3*-5值为-15。
各运算符优先级:
先乘除、后加减;取余的优先级和乘除相同。
优先级的讨论,应限于同一层括号内,同级运算一般从左到右执行。
具体规则如下:
•字符类型数据以该字符的ASCII值参加运算,参与运算的字符可以看作一个特殊的整型数。
如12.5+'A'的值为77.5,其中'A'以该字符ASCII值65参加运算。
•各种类型数据作算术运算的有关规则,详见下页“2.算术运算中的类型转换”。
特别要注意的是,两个整型数据作“/”运算时,结果是整数。
比如:
5/4的结果是1,而5.0/4的结果为1.25。
灵活地应用/的整除性质,有助于我们对整型量作一些特殊处理。
例如,求整型变量k的十位上的数,可以写作k%100/10(验证:
给定k如1765代入,k%100得65,65/10得6)。
•%只能用于整数和字符的运算,不能用于实型数据。
比如:
2%3结果为2,34%5的结果为4,'A'%6结果为5。
用算术运算符和括号将运算对象连接起来、符合C语法规则的式子称C算术表达式。
运算对象包括常量、变量、函数等。
如下面是合法的表达式:
例1.C的算术表达式示例
[1+x(a+b)1/3]*x写作:
(1+x*(pow(a+b,1.0/3)))*x
写作:
cos(y/sqrt(x*x+y*y))
求整型变量m个、十、百位之和,写作:
m%10+m/10%10+m/100%10
2.算术运算中的类型转换
自动类型转换
同一表达式中参与运算的变量和常量可能有不同类型:
C需要自动转换其中一个操作数值的类型,与另一操作数相同后参加运算。
一般转换规则:
char→short→int→float→double
即:
参加运算的表达式类型转换至其中字长最长的数据类型;同样字长的情况下的转换应保证计算结果的精度。
如:
计算表达式12-'3',则先将字符常量转换为int类型,表达式的值为-39(因为字符'3'的ASCII值为51)。
又如:
声明为floatpi=3.14159;intd=180;时计算pi/d;相除的两操作数字长相同,转换d为float类型后,再作除法运算。
注意:
每次转换只涉及参与运算的两个操作数。
如计算5/3+3.9的结果是4.9。
计算5/3时,执行的还是整除运算,结果为1;在计算1+3.9的时候,才把整数1转换为double类型,和3.9相加。
强制类型转换
除了自动实现类型转换外,还可强制类型转换,其格式为:
(类型标识符)表达式
int类型变量i、j相除,写作(float)i/j、(double)i/j,运算结果分别为float、double类型。
对表达式中变量而言,无论是自动或强制类型转换,仅是为本次运算需要,而不改变变量类型。
如计算(float)i/j并未改变声明为int类型的变量i为float类型。
例2.按照下列要求,写出相应C的算术表达式。
设x是正实数,写出不大于x的最大整数。
写作:
(int)x
计算float类型变量x的整数部分与y的小数部分之和。
写作:
(int)x+y-(int)y
求正整数m的位数。
写作:
(int)log10(m)+1
3.2.2自增、自减运算
自增、自减运算是特殊的算术赋值运算,且只能用于整型变量。
自增运算符为++,自减运算符为--。
前缀格式运算符变量后缀格式变量运算符
功能:
前缀格式先使变量加(减)1,再用其值参加所在表达式运算;后缀格式则反之。
如果单独使用,前缀、后缀格式没有区别。
如i++和++i都表示i=i+1,i--和--i也是同样。
但当自增、自减运算作为某个表达式的一个组成部分时,不同格式会产生不同效果:
intx=3,y;intx=3,y;
y=--x+3;y=x--+3;
printf("%d%d\n",x,y);printf("%d%d\n",x,y);
:
先执行x=x-1,x当前值2;再执行y=x+3,x为2、y为5;
:
先执行y=x+3,x当前值为3;再执行x=x-1,x为2、y为6。
例3.分析下面程序的运行结果。
#include
voidmain()
{inta,b,c;
a=2;b=2;c=++a+b--;
printf("a=%d,b=%d,c=%d\n",a,b,c);
a=2;b=2;c=-a---b;
printf("a=%d,b=%d,c=%d\n",a,b,c);
a=2;b=2;printf("a=%d\t",a++);
printf("b=%d\t",++b);
c=a+b;printf("c=%d\n",c);
}
【运行结果】a=3,b=1,c=5
a=1,b=2,c=-4
a=2b=3c=6
通过以上例题,可以得出关于自增、自减运算优先级的结论:
表达式中前缀格式自增、自减运算符的优先级,高于表达式中其它运算符;表达式中后缀格式自增、自减运算符的优先级,低于表达式中其它运算符。
例4.运行下列程序,分析结果。
#include
voidmain()
{inti=6,j=6,k,m;
k=++i+i+++i++;
m=j+++j+++j++;
printf("i=%dj=%d\nk=%dm=%d\n",i,j,k,m);
}
【运行结果】i=9j=9
k=21m=18
【程序说明】在BC++或其他运行环境下可能会得出不同结果。
同一个程序,在不同的运行环境中得到不同结果。
在保证程序正确性的前提下,应以易读性标准为第一。
建议不要用自增、自减运算构造颇具复杂性的表达式,以避免损害程序易读性而导致错误。
3.3赋值运算符与赋值表达式
通过赋值运算,可以把一个表达式的值赋给一个变量,赋值的对象只能是变量(包括下标变量)。
3.3.1赋值运算符
格式:
变量名=表达式
能:
先计算表达式的值,再将计算结果送给变量。
赋值表达式后加分号即为赋值语句,即:
变量名=表达式;
例如a=1+2*3.14159;执行步骤:
计算1+2*3.14159的值赋给a。
注意:
•“=”左边只能是变量,3=x;、3+x=y;都不是合法的语句。
•赋值运算自右向左
语句a=b=c=5;先执行c=5再执行b=c,最后执行a=b。
建议不要写出类似“i=(k=j+1)+(j=5);”的赋值语句,因为不同系统处理可能不同,先执行k=j+1或先执行j=5会导致不同结果。
3.3.2赋值运算时的数据类型转换
1.数据类型的赋值转换
在x=e中,若x与e类型不同,C会自动完成类型转换:
将表达式的值转换为与变量同类型的数据再赋值,具体规则如表2-4所示。
若x是值为3的int类型变量,则表达式x=x+1.8的值是4。
若c是字符变量,执行c=1345;putchar(c);后输出字符A。
因为整数1345的补码00000000000000000000010101000001,赋值给单字节的c,只能取其低字节内容01000001,为65。
2.有符号数和无符号数的转换问题
因为两者编码上有差异,当有符号整数赋值给无符号整型变量时会产生变化,例如声明shorta=-1;unsignedshortb;,执行语句b=a;后b的值为65535。
因为值为-1的短整型数的补码表示为1111111111111111,如赋值给b,b的编码也是1111111111111111。
由于b是一个无符号数,其最高位的1代表一个正的值215,所以b的值为65535。
shorta=1;unsignedshortb;执行语句b=a;后b的值也是1。
3.3.3复合算术赋值运算
形如i=i+2、s=s*(x-9.81)的算术赋值语句,C提供了缩写的运算符,表示为i+=2、s*=x-9.81。
实际是算术、位运算等运算符与赋值运算符的合成、简化,称为复合赋值运算符。
+=复合加赋值)-=复合减赋值*=复合乘赋值
/=复合除赋值%=复合取余赋值
例如:
a+=3等价于a=a+3,x*=y+8等价于x=x*(y+8),y/=4等价于y=y/4,m%=3等价于m=m%3。
注意:
在运算中,表达式作为运算的一个整体。
如s*=x-9.81等同于s=s*(x-9.81),不能理解为s=s*x-9.81。
不是非使用不可,初学者可少用、不用复合赋值运算符。
但作为C程序员,应理解这些运算符。
3.4关系运算符、逻辑运算符与逻辑表达式
程序中,往往需要根据某些条件作出判断,由条件的成立(真)与否(假)决定流程。
C中用逻辑表达式来实现条件判断。
用关系运算符可构成关系表达式。
关系表达式的值是逻辑值,因此关系表达式也是逻辑表达式。
逻辑表达式用逻辑运算符做正确连接后,也是逻辑表达式。
C中逻辑表达式使用广泛。
if语句根据其中逻辑表达式的值决定执行哪一个分支,循环语句for、while要根据其中逻辑表达式值决定循环过程是否继续。
如何根据条件写出C逻辑表达式,是本节学习应掌握的内容。
3.4.1关系运算符
关系运算是双目运算,用于比较两个运算量间的大小关系。
关系表达式格式:
表达式关系运算符表达式
关系表达式成立,其值为1;关系表达式不成立,其值为0。
1.关系运算符
>>=<<===!
=
运算结果:
成立为1,不成立为0。
关系表达式也是逻辑表达式。
例如下列语句作用是输出i、i+1、i+2、…,当i为21时终止。
while(i<=20){
printf("%d\n",i);i++;
}
关系运算符比较两操作数的数量关系。
如i<=20,若i不大于20那么表达式的值为1(真);否则为0(假)。
易犯错误:
误将==写作=。
x==3和x=3完全不同!
前者判断x和3是否相等,是关系运算,对x的值并没有影响;后者是赋值运算,经过赋值后,x的值为3。
一般不对实型数作相等或不等判断。
由于浮点编码的特殊性,某些实数(如0.3、0.6等)在用浮点格式存储的时候并不能精确表示,造成在运算时有一定的误差积累。
例5.从0度起直到60度,每间隔0.6度输出正弦函数值。
#include
#include
voidmain()
{floatdeg=0;
while(deg!
=60){
printf("sin(%.6f)=%.6f\n",deg,sin(deg*3.141593/180));
deg=deg+0.6;
}
}
【运行结果】没完没了。
将deg!
=60改写作deg<=60
2.优先级
“>、>=、<、<=”的优先级高于“==、!
=”
x>5!
=1若x大于5,表达式x>5值为1,再计算1!
=1结果为0。
k-2==y-4<5若k、y值分别为3、6,左式相当于1==2<5。
==低于<,先计算2<5得1,再计算1==1,关系表达式的计算结果为1。
在算术运算符和关系运算符中讨论,在同一层括号内各运算符的优先级依次为:
*、/、%
(双目运算)+、-
>、>=、<、<=
==、!
=
3.4.2逻辑运算符和表达式
1.C的逻辑运算符和表达式
逻辑运算判断运算对象的逻辑关系,运算对象为关系表达式或逻辑量。
!
(逻辑非)&&(逻辑与)||(逻辑或)
逻辑非
格式:
!
表达式
功能:
表达式为0则!
表达式值为1,否则为0。
将条件“x不大于3”写作逻辑表达式,表示为!
(x>3)。
逻辑与
格式:
表达式&&表达式
功能:
两边表达式值均为非0,则结果为1;否则结果为0。
“n是一个两位正整数”表示为n>9&&n<100。
当“-3 if(x>-3&&x<3)printf("%f\n",x); 将-3 逻辑或 格式: 表达式||表达式 功能: 若表达式值全为0则结果为0,否则结果为1。 条件“x绝对值大于6.25”写作x>6.25||x<-6.25。 2.逻辑表达式 用逻辑运算符将关系表达式或其他逻辑量连接起来是逻辑表达式,运算结果是逻辑意义上的“真”或“假”。 关系运算的结果“成立”或“不成立”等价于逻辑意义上的“真”或“假”,关系表达式是逻辑表达式的一种特殊形式。 逻辑表达式的结果只有1(真)或0(假) C没有表示逻辑值的数据类型,用1代表“真”,用0代表“假”。 在判断运算对象的真、假时,将非零数值当作真,0当作假。 注意区分 、 : 前者,C计算逻辑表达式的结果(很规范,真为1假为0);后者,应出现逻辑表达式处出现了0、1以外的数据,C是如何处理的(很宽容,非零作1) 语句if(x)y=1.0/x;中x作逻辑表达式使用,x非0代表“真”即条件成立。 语句含义是: x不等于0则计算y=1.0/x。 该语句等价于“if(x! =0)y=1.0/x;”。 语句if(n%2)printf("oddnumbers.\n");中n%2同样起逻辑表达式作用。 n是奇数n%2值为1代表“真”;n是偶数代表“假”。 语句作用: 判断n是奇数还是偶数决定是否输出“oddnumbers”。 n=10;s=0;while(n>0)s=s+n--;与n=10;s=0;while(n)s=s+n--;完全等价,后者中“while(n)”可以理解为“while(n! =0)”。 各逻辑运算符优先级从高到低依次为: ! 、&&、|| 将“x大于5且|y|>6”写作y>6||y<-6&&x>5是错误的,因为与优先于或,只要y大于6则表达式值为1、与x是否大于5无关。 加括号可以改变运算顺序。 可写作: (y>6||y<-6)&&x>5 在算术、关系和逻辑运算符中讨论,在同一层括号内各运算符的优先级依次为: ! *、/、% +、- >、>=、<、<= ==、! = && || 例6.根据下列条件,写出C的逻辑表达式。 •“x不等于0”,写作: x! =0或! (x==0) •“m、n都能被k整除”,写作: m%k==0&&n%k==0 •“长度分别为a、b、c的三条线段能够组成三角形”,写作: a+b>c&&a+c>b&&b+c>a •“x、y落在圆心在(0,0)、半径为r1的圆外和半径为r2的圆内”,写作: x*x+y*y>=r1*r1&&x*x+y*y<=r2*r2 C未必执行逻辑表达式中的所有逻辑运算 注意: 在由&&和||运算符组成的逻辑表达式中,为提高执行效率,规定只对能确定全式结果的最少数目的子表达式计算,即若某子表达式值可确定整个表达式值,后面的子表达式就不再计算了。 例如: intx=y=z=0;++x&&++y||++z; 由于++x&&++y为1,不管||后面是什么值,++x&&++y||++z的值肯定都是1。 因此式中的++z被忽略。 结果是: 表达式值为1,x为1、y为1,z保持初值0不变。 又如: intx=y=z=-1;++x&&++y&&++z; 由于++x为0,不管&&后面的++y是何值,++x&&++y肯定是0,因此++y被忽略;由于++x&&++y的值是0,不管下一个&&后面的++z是何值,++x&&++y&&++z肯定是0,因此++z也被忽略。 结果是: 表达式值为0,x为0、y、z保持初值-1不变。 3.5条件表达式与逗号表达式 3.5.1条件表达式 条件运算是根据给定逻辑表达式,在两个表达式中取其中一个表达式值的运算。 格式: 逻辑表达式? 表达式1: 表达式2 功能: 若逻辑表达式值非0,则以表达式1的值为条件表达式值;否则以表达式2的值为条件表达式值。 为变量z赋值x、y中较大值,写作z=x>y? x: y 取变量t的符号(-1或1),写作t>=0? 1: -1 为变量s赋值x、y、z中较大值,写作s=(s=x>y? x: y)>z? s: z 若字符变量ch为小写字母则改为大写字母,写作: ch=(ch>='a'&&ch<='z'? ch+'A'-'a': ch) 【注】条件表达式由三个表达式构造,各表达式中后缀格式的自增、自减运算,在各表达式的其它运算完成之后进行。 如: i=3;j=7;i=(i++>j)? i: j;运算结束后i为7、j为7。 计算“i++>j”,先用i当前值作比较,后执行i的自增运算,再判断为i赋何值。 不是在所有运算的最后再执行i的自增运算。 条件表达式由多个表达式组成,讨论的其中自增、自减运算的优先级问题,应就各个表达式讨论。 例7.下列程序输入变量a、b、c后,按值从大到小输出。 #include voidmain() {floata,b,c,max,mid,min; scanf("%f%f%f",&a,&b,&c); max=(max=a>b? a: b)>c? max: c; min=(min=a a: b) min: c; mid=a+b+c-max-min; printf("%f%f%f\n",max,mid,min); } 3.5.2逗号表达式 格式: 表达式1,表达式2 功能: 先计算表达式1,再计算表达式2,表达式2值为结果 例如: 若a的值为2,语句“c=(b=a++,b=a+2);”的执行步骤... 按此格式,可知若干个表达式用逗号间隔,也是逗号表达式。 例如执行语句“x=(a=3,b=5,b+=a,c=b*5);”后,变量x、a、b、c的值依次为40、3、8、40,整个表达式的值也是40(x最后的值)。 不提倡过多使用。 如c=(a=1,b=++a);写作a=1;b=++a;c=b;为宜。 3.6小结 主要介绍C的运算符和表达式。 C的运算符包括算术、关系、逻辑、赋值和条件运算符,等等。 表达式是用运算符和圆括号将操作数连接在一起的式子。 运算符有不同优先级(见附录 ),不同类型数据运算时要按一定规则进行类型转换,在书写或计算C的表达式要加以注意。 C中逻辑表达式的值只能是0或1。 关系表达式可以直接作为逻辑表达式,算术表达式也可作为特殊的逻辑表达式。 在语句if(k-5)x=y;中,k-5作逻辑表达式、等价于k-5! =0;在语句v=k-5;中被视为算术表达式。 表达式的含义,需要结合程序上下文考虑。 习题三 1.根据下列数学式,写出C的算术表达式。 2.按照要求写出下列C的表达式。 数学式(x+1)e2X所对应的C算术表达式。 将double类型变量x的整数部分与y的小数部分相加的算术表达式。 将非零实型变量x四舍五入到小数点后2位的算术表达式。 为变量s赋值: 取变量x的符号,取变量y的绝对值。 条件“-5≤x≤3”所对应的C逻辑表达式。 a、b是字符变量,已知a的值为大写字母、b的值为小写字母,写出判断a、b是否为同一字母的逻辑表达式 int类型变量a、b均为两位正整数,写出判断a的个位数等于b的十位数、且b的个位数等于a的十位数的逻辑表达式。 计算变量a、b中较小值的条件表达式。 判断变量ch是英文字母的表达式; 若字符变量ch的值为大写字母,则重新赋值为对应的小写字母。 3.声明“intk=12;floatx=9.5;doubled=2.7;charzf='B';”,写出下列表达式值。 (int)x%k*d k+5.6 10==9+1 ! k&&x>d zf='B' zf=='B' 4.填空题 声明“floatx=2.5,y=4.7;inta=7;”,表达式x+a%3*(int)(x+y)%2/4值为。 设有整型变量a,b,c,其中a、b的值分别为10与20,计算“c=(a%2==0)? a: b;”后,c的值为。 设有整型变量d的值为7,表达式“3 已知ch是字符变量。 如果ch是小写英文字母,则把它改成大写英文字母,写作: if()ch=ch-32; 下列程序的输出结果是。 #include voidmain() {inty; doubled=3.4,x; x=(y=d/2.0)/2; printf("(%0.2f,%d)",x,y); } 判断a、b是否绝对值相等而符号相反的逻辑表达式为。 判断变量a、b中必有且只有一个为0的逻辑表达式为。 c初值为3,计算赋值表达式“a=5+(c+=6)”后表达式值、a、c的值依次为。 求解赋值表达式“a=(b=10)%(c=6)”后,表达式值、a、b、c的值依次为。 求解逗号表达式“x=a=3,6*a”后,表达式值、x、a的值依次为。 若a=13、b=25、c=-17,表达式“((y=(a a: b) y: c的值为。 若s='d',执行语句“s=(s>='a'&&s<='z')? s-32: s;”后字符变量s的值为。 5.写出下列程序的输出结果。 程序 #include voidmain() {unsignedk,n; scanf("%u",&n); k=n%10*10+n/10; printf("n=%dk=%d\n",n,k); } 运行时输入数据为: 6972输出结果为: 程序 #include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详细 答案 复习题