当前位置:文档之家› C详细答案复习题c

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%102. 算术运算中的类型转换⑴自动类型转换同一表达式中参与运算的变量和常量可能有不同类型:C需要自动转换其中一个操作数值的类型,与另一操作数相同后参加运算。

一般转换规则:char→short→int→float→ double即:参加运算的表达式类型转换至其中字长最长的数据类型;同样字长的情况下的转换应保证计算结果的精度。

如:计算表达式12-'3',则先将字符常量转换为int类型,表达式的值为-39(因为字符'3'的ASCII值为51)。

又如:声明为float pi=3.14159; int d=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类型。

41 / 11例2. 按照下列要求,写出相应C的算术表达式。

设x是正实数,写出不大于x的最大整数。

写作:(int)x计算float类型变量x的整数部分与y的小数部分之和。

写作:(int)x+y-(int)y求正整数m的位数。

写作:(int)log10(m)+13.2.2 自增、自减运算自增、自减运算是特殊的算术赋值运算,且只能用于整型变量。

自增运算符为++,自减运算符为--。

前缀格式运算符变量后缀格式变量运算符功能:前缀格式先使变量加(减)1,再用其值参加所在表达式运算;后缀格式则反之。

如果单独使用,前缀、后缀格式没有区别。

如i++和++i都表示i=i+1, i--和--i也是同样。

但当自增、自减运算作为某个表达式的一个组成部分时,不同格式会产生不同效果:①②int x=3,y; int x=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 <stdio.h>void main(){ int 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; 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=5a=1,b=2,c=-4a=2 b=3 c=6通过以上例题,可以得出关于自增、自减运算优先级的结论:表达式中前缀格式自增、自减运算符的优先级,高于表达式中其它运算符;表达式中后缀格式自增、自减运算符的优先级,低于表达式中其它运算符。

例4.运行下列程序,分析结果。

#include <stdio.h>void main(){ int i=6,j=6,k,m;k=++i+i+++i++;m=j+++j+++j++;printf("i=%d j=%d\n k=%d m=%d\n",i,j,k,m);}【运行结果】 i=9 j=9k=21 m=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的补码00000000 00000000 00000101 01000001,赋值给单字节的c,只能取其低字节内容01000001,为65。

2.有符号数和无符号数的转换问题因为两者编码上有差异,当有符号整数赋值给无符号整型变量时会产生变化,例如声明short a=-1;unsigned short b;,执行语句b=a;后b的值为65535。

因为值为-1的短整型数的补码表示为11111111 11111111,如赋值给b, b的编码也是11111111 11111111。

由于b是一个无符号数,其最高位的1代表一个正的值215,所以b的值为65535。

43 / 11short a=1;unsigned short b;执行语句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要根据其中逻辑表达式值决定循环过程是否继续。

相关主题