在C语言程序中,凡是表达式可以出现的地方均可出现赋值表达式。例如,式子:x=(a=5)+(b=8) 是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。
(2)复合的赋值运算符
在赋值符“=”之前加上其他二目运算符可构成复合赋值符。例如,+=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=
构成复合赋值表达式的一般形式为:变量 双目运算符= 表达式 它等效于:变量 = 变量 运算符 表达式 例如: a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p
复合赋值运算符这种写法对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。
2.2.6 逗号运算符和逗号表达式
在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。
其一般形式为: 表达式1, 表达式2, ? 表达式n 其求值过程是从左至右分别求各个表达式的值,并以表达式n的值作为整个逗号表达式的值。
【例2.7】阅读并运行程序,分析结果加深对各种算术运算的理解。 #include
a=(b=2,++b,b+5);
printf(\The value of a is %d\\n\,a); }
语句a=(b=2,++b,b+5);先执行b=2;再执行++b,此时b的值为3;最后执行b+5,b的值为8;将8赋值给变量a,运行结果如图2-9所示。
图2-9 例2.7运行结果
2.3 应用案例
【例2.8】输入一个学生三门课程的成绩,计算三门课程的总分及平均分。 #include
{ int yw,sx,yy,sum; float aver;
21
scanf(“%d,%d,%d”,&yw,&sx,&yy); sum=yw+sx+yy; aver=sum/3.0;
printf(“sum=%d,aver=%f\\n”,sum,aver); }
运行结果如图2-10所示:
图2-10 例2.8运行结果
【例2.9】输入直角三角形的斜边和一条直角边,求三角形另外一条直角边,周长和面积。
#include \stdio.h\ #include \math.h\ void main() { float a,b,c; double l,s;
printf(\输入斜边、直角边的长:\); scanf(\ b=sqrt(c*c-a*a); l=a+b+c; s=a*b/2;
printf(\另一直角边=%f, 周长=%f, 面积=%f\\n\,b,l,s); }
使用sqrt()函数求平方根,需要预处理命令#include
图2-11 例2.9运行结果
【例2.10】输入一个三位整数,依次输出该数的正(负)号和百位、十位、个位数字。 #include \stdio.h\ #include \math.h\ void main()
{ char c1,c2,c3,c4; int x;
scanf(\%d\,&x);
c4=x>=0?'+':'-'; /* x的符号存入c4 */ x=abs(x); /* 求整型数x的绝对值 */ c3=x+48; /* x为个位数,加48转换为对应字符 */ x=x/10; /* 去掉x的个位 */
22
c2=x+48; c1=x/10+48;
printf(\数符:%c,百位:%c,十位:%c,个位:%c\\n“,c4,c1,c2,c3); }
运行结果如图2-12所示:
图2-12 例2.10运行结果
总 结
本章主要介绍了C语言中有关数据与数据计算的基本概念和规则。关于数据的主要内容有:数据类型;常量与变量;各种类型数据的表示方法、数据的取值范围和数据的有效位数。关于计算的主要内容有:运算符和运算对象、表达式及其表示、运算优先级和结合性;算术运算;赋值运算;自增、自减运算;关系运算与逻辑运算;位运算;逗号运算等。
本章内容是C语言的基本语法元素,主要是一些概念与规则,没有多少灵活性,所以需要在理解的基础上熟记。
习 题
1. 把下列数学表示式写成C语言表达式
(1)x?y?a?b (4)x?y?(2)e3?(2x?3y) (3)(ln10?xy)3
(6)
x?ysin(??) (5) 0y3xcos45?3x1
111??r1r2r32. 根据条件写一个C语言表达式
(1)a和b中有一个大于d。 (2)将x,y中大的送给z。
(3)将直角坐标系中点(x,y)表示在第3象限内。 (4)3个数据x,y,z能组成三角形。 (5)d是不大于100的偶数。(提示:d应同时满足大于0、小于等于100、被2整除。) (6)x、y中至少有一个是5的倍数。 3. 阅读程序写出执行结果
(1)以下程序的执行结果是什么? #include
{ int a=2,b=3,c; c=a++-1;
printf(“%d,%d,”,a,c); c*=a+(++b||++c);
23
printf(“%d,%d\\n”,a,c);
}
(2)以下程序的执行结果是什么? #include
a=1+2*5-3; printf(“%d,”,a); a=3+4%5-6; printf(“%d,”,a); a=-3*4%-6/5; printf(“%d,”,a); a=-(5+3)%4/2; printf(“%d\\n”,a); }
(3)以下程序的执行结果是什么? #include
{ int a=1; char c=?a?; float f=2.0;
printf(“%d,”,(a+2,c+2)); printf(“%d,”,(f>=c));
printf(“%d,”,(f!=0&&c==?A?)); printf(“%d,”,(a<0?1:2)); printf(“%d,”,(f+2.5)); }
4. 程序填空
(1)以下程序对任意输入的两个整数输出大的一个。 #include \stdio.h\ main()
{ int j,k,m;
printf(\j=? k=?\\n\); scanf(\%d,%d\,&j,&k); m=_______⑴__________ printf(\m=%d\\n\,m); }
(2)以下程序要求从键盘输入3个整数,分别存入x、y、z三个变量中,并将(x+y)*z的结果显示出来。
#include
{ int x,y,z,result;
scanf(“x=%d,y=%d,z=%d”,&x,&y,&z); _______⑴____________
printf(“%d”,___⑵_______); }
5. 编程实验题
(1)编写程序输入长方形的长和宽,求长方形的面积和周长并输出,要求用浮点型数
24
据处理。
(2)编写程序将输入的英里转换成公里。已知每英里等于5280英尺,每英尺等于12英寸,每英寸等于2.54厘米,每公里等于100000厘米。
(3)编写程序输入年利率I和存款总数S,计算一年后的本息合计并输出。 (4)编写程序,求圆柱体的表面积和体积。
习题答案
1.
(1)(x+y)!=(a+b)
(2)exp(3)+sqrt(2*x+3*y)
(3)pow((log10+x*y),3) // pow(2,3)求23,结果为8 (4)fabs(x-y)+(x+y)/(3*x)
(5)sin(n*3.14)/(cos(3.14/4)+3*pow(x,y)) (6)1.0/(1.0/r1+1.0/r2+1.0/r3) 2.
(1)(a>d)||(b>d) (2)z=(x>y)?x:y (3)x<0&&y<0
(4)((x+y)>z)||((x+z)>y)||((y+z)>x) (5)(d>=0)&&(d<=100)&&(d%2==0) (6)(x%5==0)||(y%5==0) 3.
(1)3,1,3,4 (2)8,1,0,0 (3)99,0,0,2,0, 4. 程序填空 (1)j>k?j:k;
(2)解:⑴ result=(x+y)*z; ⑵ result 5. 编程实验题 (1)解:
#include
{ float a,b,length,area;
scanf(\ length=(a+b)*2; area=a*b;
printf(\}
(2)解:略 (3)解:
#include
{ float s,i,total;
25
scanf(\ total=s*(1+i);
printf(\}
(4)解:略
常见错误和难点分析
1. 注意数据的取值范围
计算机上使用的C语言编译系统,对一个字符型数据分配一个字节的内存空间,因此字符型数据的取值范围是0~28-1,即0~255。如有下列程序段:
int a=285; char ch=a;
printf(\
运行程序得到的结果确是29,原因是285已经超过255。一个字节容纳不了285,需要将高位截去。
285:00000001 00011101 29:00011101
2. 自增、自减运算的难点分析
自增,自减表达式的计算方法一般分为两种情况:
(1)自增、自减表达式作为void main()的一般语句出现。例如: #include
j=(i++)+(++i)+(++i)+(i++)+(--i); printf(\}
运行结果:i=5,j=17
(2)自增、自减表达式作为printf函数的输出表项出现。例如: #include
printf(\}
运行结果:i=5,j=17
上述两种情况在不同的编译环境下会有不同的结果,计算方法也不相同,请重点理解和掌握自增自减表达式的计算方法。 int i=2,j;
j=(i++)+(i++)+(i++);应理解为三个i相加,故j值为6。然后i再自增三次相当于加3故i的最后值为5
j=(++i)+(++i)+(++i); i先自增1,再参与运算,由于i自增1三次后值为5
26