数据运算 数据运算是计算机的基本功能,而数据运算主要是通过对表达式的计算完成的。 C语言中运算符和表达式数据之多,在高级语言中是少见的,正是丰富的运算符和表达式 使C语言功能十分完善。 3.运算符与表达式 1 数据处理是通过运算符实现的,运算符又称为操作符。为完成一个计算过程,需要使 用表达式。表达式是将运算量用运算符连接起来组成的式子,其中运算量可以是常量、变 量或函数。 在C语言中有很多种运算符,每一种运算符都有对应的运算规则,具体规则如下。 (1)运算对象。根据运算对象的个数,分为一元运算符(运算对象只有一个), 二元运 算符(运算对象有两个), 三元运算符(运算对象有3个)。 (2)优先级。在表达式中出现多个运算符,计算表达式时必须按照一定的次序,C语 言运算符都有指定的优先级,见附录A。 (3)结合性。对于同级运算符,考虑运算的方向,就是结合性。一元运算符、三元运 算符和二元的赋值(包括复合赋值)运算符均为自右向左,其余二元运算符均为自左向右。 见附录A。 3.算术运算 2 用算术运算符连接数值型的运算量构成的式子,用来完成数值计算的功能。 案例3.关于算术运算。 1 【案例描述 】 通过键盘输入两个整数,分别输出两个数的相加、相减、相乘、相除和求余数的结果 。 【案例分析 】 在计算机上对两个整数进行运算,需要使用算术运算符 。 ·62· 【必备知识】 1)算术运算符 二元运算符号:加(+)、减(-)、乘(*)、除(/)、求余数(求模)(%)。 一元运算符号:自增(++)、自减(--)、正负号(+、-)。 2)运算顺序 ① 括号优先; ② 一元运算符,运算顺序从右向左; ③ 二元运算符,先乘除后加减,运算顺序从左向右。 算术运算符的功能与优先顺序如表3-1所示。 表3-1 算术运算符的功能与优先顺序 运算符功 能优先级结合性 + - ++ -- 正号负号自加自减高自右向左 * / % 乘 除 求余中自左向右 + - 加 减低自左向右 3)求余数运算(%) 两个运算对象只能是整型数据,运算结果是两个整数相除后的余数,余数也可以是负 数,其符号位与被除数相同。 【案例实现】 #include<stdio.h> int main( ) { int n1=18,n2=5; printf("两个数的和: n1+n2=%d\n",n1+n2); printf("两个数的差: n1-n2=%d\n",n1-n2); printf("两个数的积: n1*n2=%d\n",n1*n2); printf("两个数的商: n1/n2=%d\n",n1/n2); //注意,两个整数相除,商取整数 printf("两个数相除的余数=%d\n",n1%n2); return 0; } 【运行结果】 两个数的和: n1+n2=23 两个数的差: n1-n2=13 两个数的积: n1*n2=90 两个数的商: n1/n2=3 两个数相除的余数=3 按任意键继续… 案例3.2 自增与自减运算。 【案例描述】 通过键盘输入一个整型变量m=10,用如下表达式运算: ① --m ·27· ② m++ ③ (++m)*(m--) 【案例分析】 自增运算符“++”和自减运算符“--”分为前置运算和后置运算,由于增减运算先 后不同,从而产生运算结果不同。 【必备知识】 (1)自增++和自减--只能对变量施加运算,不能对常量或表达式施加运算。 (2)自增++或自减--写在变量之前,称为前缀,写在变量之后,称为后缀。例如: n++表示先取n的值作为表达式的值,然后运算n=n+1; ++n表示先运算n=n+1,然后取n的值作为表达式的值。 知识拓展 变量的值与表达式的值 理解自增和自减运算法前缀和后缀的不同,最关键的是理解变量的值与表达式的值 的关系,表达式为n++或者++n,变量为n。后缀模式,先取值后自加,即先取变量的值 作为表达式的值(此时变量为自加之前的值),然后完成变量的自加;前缀模式,先自加后 取值,即先完成变量自加,然后将变量的值作为表达式的值(此时变量的值为自加之后的 值)。其实如果表达式的值不作为数值参与其他运算,前缀后缀没有区别,最终只是完成 了变量的自加,但是自加表达式参与其他运算,结果就有区别了。例如m=n++和 m=++n,m 的结果是不同的。如果把自加运算看作是个人能力的提升过程,可以看出 早提升和晚提升对于结果的影响是不同的,“只争朝夕,不负韶华”,珍惜当下,做好当下。 【案例实现】 #include<stdio.h> int main() { int m=10; printf("m=%d\n",--m); //先计算m=m-1 的值为9,再输出m 的值 printf("m=%d\n",m++); //先输出m 的值9,再计算m=m+1,值为10 printf("m=%d\n",m); printf("m=%d\n",(++m)*(m--)); return 0; } 【运行结果】 m=9 m=9 m=10 m=121 请按任意键继续… 案例3.3 不同数据类型混合计算,系统自动进行类型转换。 【案例描述】 将不同类型的数据进行混合运算,查看最后运算结果的数据类型,采用sizeof()运算 ·28· 符,测试长度,进而反推数据类型。 【案例分析】 不同数据类型的运算量混合运算时,按照一定规则进行类型转换,然后进行运算。 【必备知识】 在不同类型运算量的混合运算中,编译系统自动转换数据类型,转换的规则如下。 ① 转换按数据精度增加方向进行,以保证数值不失真,或者精度不降低。 ②int和long参与运算时,先把int类型的数据转成long类型后再进行运算。 ③ 所有的浮点型运算都是以双精度进行的,即使运算中只有float类型,也要先转换 为double类型,才能进行运算。 ④char和short参与运算时,必须先转换成int类型。 ⑤ 运行结果的数据类型自动转换为保存运行结果变量的数据类型。 数据转换方向如图3-1所示。 图3-1 数据转换方向图 【案例实现】 #include<stdio.h> #define PI 3.14159 int main() { char ch='a'; int i=5; unsigned int j=6; long int k=12; float f=3.0; double d=6.0; printf("%u\n",sizeof(ch/i+i*k-(j+k)*(f*d)/(f+i))); return0; } 【运行结果】 8 请按任意键继续… 长度为8的数据类型为双精度型,因此最终输出的数据类型为双精度型。 案例3.4 强制性数据类型转换。 【案例描述】 两个整型数据进行运算时,结果输出为浮点型。 【案例分析】 两个整型数据进行运行,无法得到浮点型结果。因此,可以采用强制类型转换完成。 ·29· 【必备知识】 使用强制类型转换应注意以下几点。 (1)在进行强制类型转换时,类型关键字必须用“()”括住。 (2)在对一个表达式进行强制类型转换时,整个表达式应该用“()”括住。如果 (float)(a+b)写成(float)a+b,则只对变量a进行了强制类型转换。 (3)在对变量或表达式进行了强制类型转换后,并不改变变量或表达式原来的类型。 (4)由数据长度长向数据长度短的强制转换时会丢掉一些数据位数,因而会造成值 的改变。例如,将float型或double型强制转换成int型时,对小数部分是四舍五入还是 简单地截断,取决于具体的系统。VisualC++采用的是截断小数的办法。 【案例实现】 #include<stdio.h> int main() { int n1, n2; n1 =25; n2 =15; printf("n1/n2 结果为浮点数值: %f\n",(float)n1/n2); return 0; } 【运行结果】 n1/n2 结果为浮点数值: 1.666667 请按任意键继续… 3.3 赋值运算 在C语言中,赋值运算符“=”与赋值语句紧密相关,赋值表达式的末尾加上“;”就是 赋值语句。 案例3.5 当整形变量a初值12,完成以下规定的表达式运算,输出其结果。表达 式:a+=a-=a*a。 【案例描述】 复合赋值运算符,左侧为对其赋值的变量,后为运算式,其运算结果就是更新前面的 变量值,加深理解运算的结合性:自右向左。 【案例分析】 在计算赋值表达式a+=a-=a*a时,按从右到左的顺序先计算a*a,得144,然后 进行a-=144的赋值运算,得到a=12-144=-132,该值作为赋值表达式a-=a*a的 值,参加下一个赋值表达式的计算,得a=a+(-132)=-264。因此,当同一变量被连续 赋值时,要注意其值在不断变化。 【必备知识】 ① “=”在C语言中不是表示相等关系,而是进行赋值运算,即将“=”右侧的值赋给 “=”左侧的变量。 ② “+=、-=、*=、/=、%=”是复合赋值运算符,具有算术运算和赋值的双重功 ·30· 能。在使用复合赋值运算符时,要将右边的表达式作为一个整体与左边的变量进行运算。 ③ 赋值运算符的优先级是比较低的,结合性均为从右到左。参见附录A。 知识拓展 赋值运算符的启示 在v=e这样的赋值表达式中,当v和e的数据类型不一致时,C编译系统自动将e 的类型转换成与v相同的类型后再赋值。 e本身有自己的数据类型,但是当它位于赋值号右侧时,其数据类型已经不重要了, 最终赋值的类型由v决定,这是由二者的所处的位置决定的。赋值符号如此,人生的很多 问题亦是如此,只不过人生中的位置更多指的是每个人努力后的内在实力。 【案例实现】 #include <stdio.h> int main() { int a=12; a+=a-=a*a; //该表达式可拆分为a=a-a*a; a=a+a; printf("%d\n",a); return 0; } 【运行结果】 -264 3.4 逗号运算(顺序运算) 逗号运算符“,”的作用是连接多个数据项,从而将它们作为一个整体来处理。 案例3.6 计算下面逗号表达式的值,并对比输出结果。表达式为a=3*5,a*4, a+5和a=(3*5,a*4,a+5)。 【案例描述】 逗号表达式,是将多个表达式串在一起,顺序计算各个表达式的值。将最后一个表达 式的值作为整个表达式的值。 【案例分析】 在计算逗号表达式a=3*5,a*4,a+5中,按表达式顺序,先计算a=3*5=15;再计 算a*4=15*4=60;最后计算a+5=15+5=20,结果20作为逗号表达式的值。 【必备知识】 (1)逗号运算符在C语言中优先级是最低的,参见附录A。 (2)结合性:从左到右。 (3)逗号表达式的结果:最后一个表达式的值。 (4)逗号表达式应用。 ① 用一个逗号表达式语句可代替多个赋值语句。 ·31· a=0;b=1;c=2; 可写成 a=0,b=1,c=2; ② 用一个逗号表达式语句可得到多个计算结果。 y=10; x=(y=y-5,60/y); 执行后,x的值为12,y的值为5。 注意以下两个语句的区别: a=3*5, a*4; /* 逗号表达式的值为60 */ x=(a=3, 3*6); /*有赋值运算符,将右侧的逗号表达式的值赋给变量x, /*"()"中逗号表达式值为18 ③ 当某些语法位置只允许出现一个表达式时,用逗号表达式可实现多个表达式的运 算,例如循环中for语句: for(i=0,j=0;i<8,j<10;i++,j++) 【案例实现】 #include <stdio.h> int main() { int a=5; printf("%d\n", (a=3*5,a*4,a+5)); a=5 printf("%d\n", a=(3*5,a*4,a+5)); return 0; } 【运行结果】 20 10 请按任意键继续… 3.5 关系运算和逻辑运算 在程序设计中,关系运算和逻辑运算通常用在程序流程控制中的if、switch、for或 while语句中,目的是进行条件判断,以便程序能按照指定的流程运行。 3.5.1 关系运算 案例3.7 输入两个整数,找出其中较大的值。 【案例描述】 通过键盘输入两个数,进行比较,找出值较大的数。 【案例分析】 要进行两个数的比较,需要用到关系运算符和分支语句。 ·32· 【必备知识】 关系就是将两个数据进行比较,判定两个数据是否符合给定的关系。关系运算符是 用来比较两个数据的运算符,运算结果为逻辑值:真和假(分别用整数1和0表示),表3-2 列出C语言中的关系运算符和用法。 表3-2 关系运算符和用法 运算符名 称优先级范 例结 果结合性 > 大于 >= 大于或等于 < 小于 <= 小于或等于 == 等于 != 不等于 6 7 3>2 1 3>=2 1 3<2 0 3<=2 0 3==2 0 3!=2 1 自左向右 注意: ① 关系运算符“==”不要误写成赋值运算符“=”。 ② 优先级数值越大,参与运算的顺序靠后。 知识拓展 如何表述数据范围 一个关系运算符可以表述数据之间的关系,如果想表示数据范围呢? 数学中常见的 m ≤x≤n 的形式是否就是区间[m ,n]正确的计算机表述呢? 可以按照关系运算符的从 左向右的规则计算一下上述形式是否正确,结果显而易见,m ≤x 的运算结果只有两种可 能性,“真”或者是“假”,其数值为“1”或者“0”,显然0≤n 或者1≤n 并不是该表达式想要 表述的含义,这时就需要用到逻辑运算符。 【案例实现】 #include<stdio.h> int main() { int x,y,max; printf("请输入两个整数: "); scanf("%d,%d",&x,&y); if (x>y) max=x; else max=z; printf("两个整数中较大值=%d\n",max); return 0; } 【运行结果】 请输入两个整数: 5 7 ·33· 两个整数中较大值=7 请按任意键继续… 3.5.2 逻辑运算 案例3.8 计算逻辑表达式中变量k、x、y、z 的值。表达式为k=x++>=0&& !(y--<=0)‖(z=x+y)。 【案例描述】 在复杂表达式运算中,掌握运算符的优先级和逻辑运算规定的运算规则。 【案例分析】 逻辑运算符使用3个时,按照逻辑运算符的优先级和结合性进行运算。 【必备知识】 1)逻辑运算符 逻辑运算符用来对两个关系式或逻辑量进行逻辑运算,运算结果为逻辑值:真和假 (分别用整数1和0表示),表3-3列出C语言中的逻辑运算符和用法。 表3-3 逻辑运算符和用法 运 算 符名 称优 先级 结 合 性 ! 逻辑非2 自右向左 && 逻辑与11 ‖ 逻辑或12 自左向右 2)逻辑运算规则 参加逻辑运算的运算量可以是任何类型的数据。在C语言中进行逻辑运算时,由于 C语言本没有逻辑类型,在内部计算中使用整数表达关系运算和逻辑运算的结果,0表示 逻辑假,而非0的值表示逻辑真,非0值表示逻辑真,0值表示逻辑假。表3-4为逻辑运算 真值表。 表3-4 逻辑运算真值表 a b a&&b a‖b !a 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 知识拓展 如何理解C语言的逻辑值? 为了方便记忆,总结如下。整数0为逻辑假,非0都是逻 辑真;逻辑真的值是1,逻辑假的值是0。 注意:逻辑运算符出现在不同表达式中时其计算方法和顺序不同,具体如下。 ① 当逻辑运算符&&,在计算逻辑表达式,如(表达式1)&&(表达式2)&&…时, ·34· 表达式1的值为“假”,后面表达式不再进行计算,整个逻辑表达式的值为“假”。 ② 当逻辑运算符‖,在计算逻辑表达式,如(表达式1)‖(表达式2)‖…时,表达式1 的值为“真”,后面表达式不再进行计算,整个逻辑表达式的值为“真”。 ③ 当3个运算符有两个或两个以上同时使用时,根据运算符的优先级和结合性进行 运算。 【案例实现】 #include<stdio.h> int main() { int x=-1,y=5,z=6,k; k=x++>=0&&!(y--<=0)||(z=x+y); //x++>=0 为假,y--<=0 不计算 printf("k=%d,x=%d,y=%d,z=%d\n",k,x,y,z); return 0; } 【运行结果】 k=1,x=0,y=5,z=5 请按任意键继续… 知识拓展 数据范围表述 内容学习到这里,应该已经理解了如何用计算机表达式来表述数据范围了,那就是用 逻辑与,区间[m ,n]正确的计算机表达式为m <=x &&x<=n。所以学习知识切忌生 搬硬套,刻舟求剑是不可取的。 3.6 位运算 C语言和其他语言不同的是,它完全支持按位运算,主要用于编写系统软件,实现汇 编语言能够对位操作的功能。 案例3.9 对十进制整数25和120,分别进行位与,位或,左移2位,右移2位和位取 反操作。 【案例描述】 定义两个整型变量a=25,b=120,进行位运算的各种操作后,显示变量a、b 值发生 的变化。 【案例分析】 十进制数转换成二进制数,对二进制数进行位与,位或,位异或,移位和位取反操作, 每个运算量的二进制位上的0和1会发生相应变化。 【必备知识】 1)位运算符 位运算符是针对二进制数的每个二进制位进行运算的符号,对数字0和1进行二进 制位操作,结果如表3-5所示。 ·35· 表3-5 二进制位运算符 运 算 符名 称优先级范 例结 果结合性 & 按位与8 0&0 0 0&1 0 1&0 0 1&1 1 自左向右 | 按位或9 0|0 0 0|1 1 1|0 1 1|1 1 自左向右 ^ 按位异或10 0^0 0 0^1 1 1^0 1 1^1 0 自左向右 ~ 按位取反2 ~0 1 ~1 0 自右向左 << 左移位 >> 右移位 5 00000010<<2 00001000 10010011<<2 01001100 01100010>>2 00011000 11100010>>2 11111000 自左向右 自左向右 &=、|=、^ =、 <<=、>>= 位复合赋值 运算符14 略略自右向左 2)位操作符 位操作符分为两类,一类为位逻辑运算,另一类为移位运算。位逻辑运算实现二进制 位与二进制位之间的逻辑运算,移位运算实现二进制位的顺序向左或向右移位。 注意: (1)位逻辑运算的运算量只能是字符型和整型数据。 (2)与逻辑运算的结果只能是0或1不同,按位逻辑运算的结果可能是任何整数值。 3)位运算6种操作 (1)按位与(&)。例如: int a=65,b=120,c; //a,b 看成1B 长度的整型数 c=a&b; 01000001 & 01111000 01000000 (结果:十进制整数64) ·36· (2)按位或(|)。例如: int a=65,b=120,c; //a,b 看成1B 长度的整型数 c=a|b; 01000001 | 01111000 01111001 (结果:十进制整数121) (3)按位异或(^)。例如: int a=65,b=120,c; //a,b 看成1B 长度的整型数 c=a^b; 01000001 ^ 01111000 00111001 (结果:十进制整数57) (4)按位取反(~)。例如: int a=65,b; //a 看成1B 长度的整型数 b=~a; ~ 01000001 10111110 (结果:十进制整数190或-66) (5)左移位(<<)。例如: int a=25,b; b=a<<3; 对无符号数,左移位相当于乘2运算,左移n 位相当于该数乘2n ,在本例中,25<<3 表示25×23=200,如图3-2所示。 图3-2 将a左移3位存入b (6)右移位(>>)。在移位过程中,各个二进制位顺序向右移动,移出右端之外的位 被舍弃,左端空出的位是补0还是补1取决于具体的机器和被移位的数是有符号数还是 无符号数。具体如下。 ① 对无符号数进行右移时,左端空出的位一律补0。 ② 对用补码表示的有符号数进行右移时,有的机器采取逻辑右移,有的机器则采取 算术右移。逻辑右移时,不管是正数还是负数,左端空位一律补0。算术右移时,正数右 移,左端的空位全部补0;负数右移,左端的空位全部补1(即符号位)。VisualC++ 2010 采用的是算术右移。例如: int a=-32768,b; b=a>>2; //逻辑右移和算术右移得到不同的值 ·37· ① 逻辑右移:a的各个二进制位顺序右移2位,其值为8192。 ② 算术右移,左侧空格补1,值为-8192。 采用算术右移相当于除2运算。右移1位,其值等于该数除以2,右移n 位,其值等 于该数除以2n 。本例中,-32768>>2表示-32768÷22=-8192,如图3-3所示。 图3-3 将a进行右移存入b 【案例实现】 #include <stdio.h> int main() { int a=25,b=120,c1,c2,n=1; c1=a,c2=b; //c1,c2 为a,b 的原值 a&=b; b|=a; printf("a=%d&%d=%d b=%d|%d=%d\n",c1,c2,a,c2,c1,b); a=c1,b=c2; a>>=n+1; b<<=n+1; printf("a=%d>>%d=%d b=%d<<%d=%d\n",c1,n+1,a,c2,n+1,b); a=c1,b=c2; a=~ a; b^=a; printf("a=~ %d=%d b=%d^%d=%d\n",c1,a,c2,c1,b); return 0; } 【运行结果】 a=25&20=24 b=120|25=120 a=25>>2=6 b=120<<2=480 a=~25=-26 b=120^25=-98 请按任意键继续… 知识拓展 运算符的优先级 ① 括号的优先级最高; ② 单目(一元)运算符高于双目运算符; ③ 算术运算高于关系运算; ·38· ④ 关系运算高于逻辑运算; ⑤逻辑运算高于赋值运算; ⑥逗号运算最低。 习题 3 一、选择题 1.C语言中要求运算量必须是整型的运算符是( ) 。 A.+ B./ C.% D. 2. 在C语言中,不同类型的数据混合运算时,先要转换成同一类型,然后进行计算。 设一表达式中含有int、long、unsigned和char类型的常数和变量,则表达式的最后运算 结果是(【1】)类型。这四种类型的转换规律是(【2】)。 【1】A.int B.char C.unsigned D.long 【2】A.int→unsigned→long→char B.char→int→long→unsigned C.char→int→unsigned→long D.char→unsigned→long→int 3.a、b均为整数,且b≠0,则表达式a/b*b+a%b 的值为( )。 A.a B.b C.a被b除,结果的整数部分D.a被b除,结果的整数部分 4.a、b均为整数,且b≠0,则表达式a-a/b*b 的值为( )。 A.0 B.a C.a被b除的余数部分D.a被b除,商的整数部分 5. 表达式18/4*sqt(0)/8的数据类型为( )。 r4. A.it fot dulD. 不确定 nB.laC.obe A.j=4,k=4 B.j=4,k=3 j、 6. 若变量已正确定义,且k的值是4,执行表达式j=k--后,k的值是( )。 C.j=3,k=4 D.j=3,k=3 7. 设intx=10,x+=3+x%(-3), 则x=( )。 A.14 B.15 C.11 D.12 8. 表达式(t)(3.0)的值是( )。 in0/2. A.1.B.0 1 0 5 1.C.D. 9. 设f0,n0的表达式是( )。 0;使m为10. A.m-=n*2.B.=C.m*=n6 loatm=4.=4. 5 m/n+9 -D.m+=n+2 10.C语句x*=y+2;还可以写成( ) 。 A.x=x*y+2; B.x=2+y*x; C.x=x*(y+2); D.x=y+2*x; 11. 若变量已正确定义,要将a和b中的数进行交换,则下列不正确的语句组 是( )。 ·93· A.a=a+b,b=a-b,a=a-b; B.t=a,a=b,b=t; C.a=t;t=b;b=a; D.t=b;b=a;a=t; 12.设已定义:intk=7,x=12;下列表达式中,计算结果为0的是( )。 A.x%=(k%=5) B.x%=(k-k%5) C.x%=k-k%5 D.(x%=k)-(k%=5) 13.若已定义x和y为double型变量,则表达式:x=1,y=x+3/2的值是( )。 A.1 B.2 C.2.0 D.2.5 14.设intc=5和inta,a=2+(c+=c++,c+8,++c),则a的值为( )。 A.15 B.14 C.13 D.16 15.设inta=7,b=8;则printf("%d,%d",(a+b,a),(b,a+b));的输出是( )。 A.7,15 B.8,15 C.15,7 D.出错 16.设inta=3;则表达式a<1&&--a>1的运算结果和a的值分别是( )。 A.0和2 B.0和3 C.1和2 D.1和3 17.已知intx=43,y=0;charch='A';则表达式(x>=y&&ch<'B'&&!y)的值 是( )。 A.0 B.语法错C.1 D.-1 18.为表示“a和b都大于0”,应使用的C语言表达式是( )。 A.(a>0)|(b>0) B.a&&b C.(a>0)||(b>0) D.(a>0)&&(b>0) 19.设a为整型变量,下列不能正确表达数学关系:10<a<15的C 语言表达式 是( )。 A.10<a<15 B.a==11||a==12||a==13||a=14 C.a>10&&a<15 D.!(a<=10)&&! (a>=15) 20.设有以下语句,则z的二进制值是( )。 char x=3,y=6,z; z=(x^y)<<2; A.00010100 B.00011011 C.00011100 D.00011000 二、填空题 1.设有以下定义,并已赋确定的值: char ch; int i; float f; double d; 则表达式ch*i+d-f的数据类型为。 2.设有inta=11;,则表达式(a++*1/5)的值为。 3.运行以下程序段,若要使a=5.0,b=4,c=3,则输入数据的形式应为。 int b,c; float a; ·40· scanf("%f,%d,c=%d",&a,&b,&c); 4.设已定义inta=10,b=12,则表达式!a||b--的值是。 5.若a为int型变量,请以最简单的形式写出与逻辑表达式!a等价的C语言关系表 达式。 6.若有以下程序段 int a=1,b=2,c; c=1.0/b*a; 则执行后,变量c的值为。 三、编程题 1.编写程序,其功能是从键盘输入长方体三边的边长x、y、z,然后求其表面积a 和 体积v。 2.编写程序,其功能是从键盘输入圆的半径r,计算并输出该圆的面积s 和周长c。 3.编制程序,其功能是从键盘输入3个顶点的坐标(x1,y1),(x2,y2),(x3,y3),按海 伦公式计算三角形的面积s。 ·41·