C参考答案与复习题cWord格式文档下载.docx
《C参考答案与复习题cWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《C参考答案与复习题cWord格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
特例如赋值“x=y=3”,先计算y=3、再计算x=y。
特例将特别指出,一般按缺省。
主要介绍算术(包括自增自减)、关系、逻辑、赋值、逗号运算符,以及由这些运算符构成的各类表达式。
3.2算术运算符与算术表达式
内容:
算术运算符及其功能,算术表达式,优先级、运算时的类型转换规则。
3.2.1算术运算符
1.算术运算符
C的算术运算符有:
+-*/%(取余)
其中“-”可作单目运算符,如-5,表达式3*-5值为-15。
各运算符优先级:
先乘除、后加减;
取余的优先级和乘除相同。
优先级的讨论,应限于同一层括号内,同级运算一般从左到右执行。
具体规则如下:
•字符类型数据以该字符的ASCII值参加运算,参与运算的字符可以看作一个特殊的整型数。
如12.5+'
A'
的值为77.5,其中'
以该字符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,'
%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(因为字符'
的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;
y=--x+3;
y=x--+3;
printf("
%d%d\n"
x,y);
printf("
%d%d\n"
:
先执行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<
stdio.h>
voidmain()
{inta,b,c;
a=2;
b=2;
c=++a+b--;
a=%d,b=%d,c=%d\n"
a,b,c);
a=2;
b=2;
c=-a---b;
a=%d\t"
a++);
b=%d\t"
++b);
c=a+b;
c=%d\n"
c);
}
【运行结果】a=3,b=1,c=5
a=1,b=2,c=-4
a=2b=3c=6
通过以上例题,可以得出关于自增、自减运算优先级的结论:
表达式中前缀格式自增、自减运算符的优先级,高于表达式中其它运算符;
表达式中后缀格式自增、自减运算符的优先级,低于表达式中其它运算符。
例4.运行下列程序,分析结果。
{inti=6,j=6,k,m;
k=++i+i+++i++;
m=j+++j+++j++;
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;
执行语句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){
%d\n"
i);
i++;
关系运算符比较两操作数的数量关系。
如i<
=20,若i不大于20那么表达式的值为1(真);
否则为0(假)。
易犯错误:
误将==写作=。
x==3和x=3完全不同!
前者判断x和3是否相等,是关系运算,对x的值并没有影响;
后者是赋值运算,经过赋值后,x的值为3。
一般不对实型数作相等或不等判断。
由于浮点编码的特殊性,某些实数(如0.3