版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第 2 章 C程序设计入门学习C程序设计一开始就要试着编写程序,先“照猫画虎”,模仿编写教材中的程序,然后改写程序,循序渐进,由“知”到“悟”,逐步体会程序设计的基本思想和方法,直到自己能独立编程,最终编写出能解决实际问题的计算机程序。2.1 编写简单的C程序2.1.1 计算1+2的程序例2.1 编写程序,计算1+2,并将结果在屏幕上显示出来。1 #include 2 int main( ) 3 4 int number1=1,number2=2,sum;5 sum=number1+number2;6 printf(“1+2=%dn”,sum);7 return 0;8 该程序的输出结果是:
2、1+2=3说明:(1) 在C语言中,变量是指那些在程序运行期间其值可以改变的量,其值不能改变的量叫常量。变量必须是先定义后使用,定义变量时要指定变量名和数据类型。变量的命名与常量、函数、数组、类型等标识符的命名规则相同,最好是“见名知义”,采用英文单词或字符组合。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第1个字符必须为字母或下划线,不能是数字;不能使用C语言关键字(C语言关键字见表2.1);不能与C语言标准库函数名相同;C语言区分大小写,如Sum与sum是不同的标识符。在C语言中,基本数据类型有:int(整型)、float(单精度型)、double(双精度型)和char(字符型
3、)。变量的数据类型决定了该变量只能存储这个类型的数据。若int number1;number1=1.9;C编译系统会先将1.9转换为整数1,然后再存放到number1中。(2) 在计算机中,内存是一个连续编址的空间。程序中定义的变量,经过编译后将产生一张变量与内存地址的对应表。根据这个对应表,编译系统通过变量名先取它所对应的地址,再根据变量的数据类型,确定它在内存中所占的字节数,然后对所占的内存空间进行存、取操作。(3) 对于程序中定义的变量,编译系统要为它们分配内存空间,也就是说,变量在内存中占据了一个位置。不同数据类型的变量所占内存的字节数是不同的。在VC+ 6.0中,int型的变量占用4
4、个字节、float型的变量占用4个字节、double型的变量占用8个字节、char型的变量占用1个字节。(4) 程序第4行为定义变量赋初值, 共定义了3个变量,它们是:number1,number2,sum,它们的数据类型均为整型(int),变量number1中存放整数1,变量number2中存放整数2,变量sum中将存放和,虽然它在内存中占据了存储空间,但现在还没有数据。内存和变量值示意图见图2.1。表2.1 C语言关键字关键字说明关键字说明auto自动变量,属于动态存储方式int整数类型break终止一个循环或一个switch语句long用于定义整数、实数类型case用在switch语句中
5、的一种“情况”register用于声明寄存器变量char字符类型,占一个字节return返回值到调用点的语句const内存单元中的值不允许改变short短整数类型continue结束本次循环,继续下一个循环signed用于定义整数类型defaultswitch语句中的“其他”情况sizeof长度运算符,结果为字节数do用在do-while语句中static与程序共“存亡”double双精度类型sruct用于声明一个结构体类型else用在if-else语句中,是另一种选择switch指定一个switch语句 enum用于声明一个枚举类型typedef为已有类型定义一个同义词extern用于声明已
6、定义的外部变量union共用体各成员占用相同存储空间float单精度类型unsigned用于定义整数类型for指定一个for循环void用于函数表示函数无返回值goto程序跳转到有标号的语句volatile声明在程序控制外可修改的变量if指定一个if语句while指定一个while循环(5) 程序第5行是计算并赋值,即将变量number1和number2中的值相加,并将结果赋给变量sum(即保存到sum中)。这时变量sum的值为3。内存number1number2sum变量图2.1123(6) 程序第6行是函数调用语句,双引号里的普通字符“1+2=”(除“%d”和“n”外)在屏幕上按原样输出,
7、而%d是格式声明,它的位置将显示变量sum的值。(7) 输出函数printf用来按指定的格式输出数据,其一般调用形式为 printf(“格式控制字符串”,输出表列);其中,格式控制字符串用双引号括起来,用来规定输出格式。%d用来输出十进制整数,%f用来输出实数。%c用来输出一个字符,%s用来输出一个字符串。(8) 如果用程序组件表示程序的话,例2.1由6个基本组件组成,例2.1只是比例1.1多了2个新组件“定义变量赋初值”和“计算并赋值”(上述说明中加粗、倾斜的字)。组件个数及名称见图2.2。将图2.2中的程序组件拖动到图2.3的虚线框内排序,直到符合程序的流程为止。正确的排序结果见图2.4。
8、 根据图2.4,就能很容易地写出与例2.1类似的C程序。 放置组件图2.3放置组件放置组件放置组件放置组件放置组件return 0;预处理命令main( )定义变量赋初值计算并赋值输出函数图2.4预处理命令程序组件main( )输出函数return 0; 定义变量赋初值值 计算并赋值 图2.2练习2.1 编写程序,计算1*2*3的结果并在屏幕上显示出来。练习2.2 编写程序,给定圆的半径r为2.1cm,计算圆的面积和周长。练习2.3 编写程序,求华氏温度370F对应的摄氏温度。若用c表示摄氏温度,用f表示华氏温度,则计算公式为: c=59(f-32) 2.1.2 任意两个整数相加的程序例2.2
9、 编写程序,从键盘任意输入两个整数,将其相加并在屏幕上输出和。1 #include 2 int main( ) 3 4 int number1,number2,sum;5 scanf(“%d%d”,& number1,&number2);6 sum=number1+number2;7 printf(“sum=%dn”,sum);8 return 0;9 该程序的输出结果是:(书中凡带有下划线的均为从键盘输入的内容)3 4sum=7说明:(1) 程序第5行为scanf( )函数,是C语言提供的输入函数,用来按指定的格式接收输入数据。其用法与printf( )相同。输入函数scanf的一般调用形式
10、为scanf(“格式控制字符串”,地址表列);注意在格式控制字符串后面应当是变量的地址,而不是变量名。如&number1是变量 number1的地址,&number2是变量number2的地址。scanf函数的圆括号中,用双引号括起来的%d指定输入的数据应为十进制整数。第一个%d用来控制输入的第一个整数3存放在变量number1中,第二个%d用来控制输入的第二个整数4存放在变量number2中。(2) 程序第6行将变量number1和number2中的值相加,并将结果赋给变量sum。这时变量sum的值为7。此时变量、内存和变量值示意图见图2.5。内存number1number2sum变量图2.
11、5347(3) 如果用程序组件表示程序的话,例2.2只是比例2.1多了一个新组件“输入函数”(上述说明中加粗、倾斜的字)。这样例2.2由7个基本组件组成,组件个数及名称见图2.6。将图2.6中的程序组件正确排序后的结果见图2.7。 根据图2.7,就能很容易地写出与例2.2类似的C程序。练习2.4 编写程序,从键盘输入圆的半径,计算并输出圆的面积和周长。练习2.5 编写程序,将练习2.3改为从键盘任意输入华氏温度,求对应的摄氏温度。练习2.6 编写程序,从键盘任意输入x和y的值,求表达式z=3x+4y的值。程序组件预处理命令main( )输出函数return 0;定义变量赋初值值图2.6计算并赋
12、值输入函数输出函数预处理命令main( )定义变量赋初值输入函数计算并赋值图2.7return 0;2.1.3 大小写字母转换的程序例2.3 编写程序,从键盘任意输入一个小写字母,将其大写字母在屏幕上输出。1 #include 2 int main( ) 3 4 char small,capital;5 scanf(“%c”,&small);6 capital =small-32;7 printf(“%c %dn”,capital,capital);8 return 0;9 该程序的输出结果是:aA 65说明:(1) 美国标准信息交换码(American Standard Code for I
13、nformation Interchange),简称为ASCII码(见表2.2)。在ASCII字符集中,每一个字符都有一个唯一的ASCII码。字符数据在内存中存储的是该字符的ASCII码,形式与整数的存储形式相同。因此,允许把字符作为整数来使用。用ASCII码表示的字符称为ASCII码字符。一个ASCII码字符占存储空间的一个字节,它的最高位固定为0,其余七位用于字符编码。如01000001代表大写字母A,01100001代表小写字母a。特别需要指出的是,十进制数字字符的ASCII码与它们的二进制值是有区别的。例如,十进制数3转换为7位的二进制数时为0000011B,而十进制数字字符“3”的A
14、SCII码值为0110011B=(51)10。要确定一个数字、字母、符号或控制字符的ASCII码值,可在表2.2中先查出它的位置,并确定它所在的行和列,然后根据行数可以确定被查字符的低4位编码(d3、d2、d1、d0),根据列数可以确定被查字符的高3位编码(d6、d5、d4)。将高3位编码与低4位编码连接在一起,就是要查字符的ASCII码值。表2.2 ASCII码 d6 d5 d4d3 d2 d1 d000000010100111001011101110000NULDLESP0Pp0001SOHDC1!1AQaq0010STXDC22BRbr0011ETXDC3#3CScs0100EOTDC4
15、$4DTdt0101ENQNAK%5EUeu0110ACKSYN&6FVfv0111BELETB7GWgw1000BSCAN(8HXhx10001HTEM)9IYiy1010LFSUB*:JZjz1011VTESC+;Kk1100FFFSNn1111SIUS/?O-oDEL(2) 小写字母的ASCII代码比大写字母的ASCII代码大32。程序第5行,从键盘输入的a-存放到变量small中;程序第6行capital =small-32;表示把变量small的值减32(即a-32,就是97-32,其值为65),然后存放到变量capital中。 (3) 变量capital中的值65,在内存中以二进制
16、形式存储,当输出格式符为”%c”时,输出的值是一个字符A;当输出格式符为”%d”时,输出的值是一个十进制整数65,见图2.8。 变量 内存01000001Capital 输出格式符为”%c”,显示结果:A输出格式符为”%d” 显示结果:65图2.8(4)如果用程序组件表示程序的话,例2.3与例2.2相同,程序所用的组件有:预处理命令、main( )、定义变量赋初值、输入函数、计算并赋值、输出函数、return 0;。请将这些组件按照程序流程进行排序,并根据正确排序的结果写出该程序。练习2.7 编写程序,从键盘输入一个大写字母,在显示屏幕上显示对应的小写字母。练习2.8 编写程序,定义3个字符变
17、量,其初值分别为B,O,Y,要求用putchar函数输出各变量的值。(可查阅附录1 C常用库函数)。练习2.9 编写程序,从键盘输入BOY三个字符,然后在显示屏幕上显示。要求用到getchar函数和putchar函数(可查阅附录3 C常用库函数)。2.2 运算符和表达式2.2.1 运算符和表达式的基本概念计算机进行数据运算主要是通过对表达式的计算进行的。在C语言程序中,表达式是计算求值的基本单位。表达式是由运算符和操作数按一定语法形式组成的式子,在表达式后面加上分号就构成了语句。运算符是指要求编译程序执行特定算术或逻辑等操作的符号。运算符操作的数据被称为操作数。操作数可以是常量、变量和函数。执
18、行表达式所规定的运算所得到的结果就是表达式的值,该值具有某种数据类型。运算符按操作数的个数可分为三种:单目运算符、双目运算符和三目运算符(C运算符见表2.3)。运算符具有优先级和结合性,表达式的求值顺序取决于表达式中各种运算符的优先级和结合性。当一个表达式中含有多个运算符时,首先进行优先级高的运算,然后再进行优先级低的运算。对于同一优先级的运算符,其运算顺序就要看运算符的结合性了。C语言中各运算符的结合性分为两种,即左结合性(从左到右)和右结合性(从右到左)。表2.3 C运算符运算符运算符名称含义优先级结合性()括号运算符括号,最高优先级0从左到右 下标运算符数组下标,访问地址运算1-成员访问
19、运算符指向结构体或共用体成员.取结构体或共用体成员+自增运算符(后置)变量后加1,单目运算符-变量后减1,单目运算符+自增运算符(前置)变量先加1,单目运算符2从右到左-变量先减1,单目运算符&地址运算符取地址*指针运算符访问地址或指针+正号运算符正号-负号运算符负号位运算符按位取反!逻辑运算符逻辑非sizeof长度运算符测试数据长度(类型名)类型转换运算符强制类型转换3*算术运算符相乘4从左到右/相除%取两整数相除的余数+相加5-相减右移位大于=大于或等于=等于 8!=不等于&位运算符按位“与”9按位“异或”10|按位“或”11&逻辑运算符逻辑“与”12|逻辑“或”13?:条件运算符条件运算
20、14从右到左=赋值运算符赋值15*=先乘,再赋值/=先除,再赋值%=先求余,再赋值+=先加,再赋值-=先减,再赋值=先右移位,再赋值&=先逐位“与”,再赋值=先逐位“异或”,再赋值|=先逐位“或”,再赋值 ,逗号运算符逗号运算16从左到右2.2.2 算术运算符与算术表达式算术运算符有+(加)、-(减)、*(乘)、/(除)、%(取余),均为二元运算符,连接的是两个操作数,其意义和优先级与数学中的一致,即先乘除、后加减,同级运算自左向右,+(自增)、-(自减)、正负号是一元运算符,只能连接一个操作数。1. 除和取余运算当“/”用于两个整数(int型或char型)相除时,只保留商的整数部分,小数部分
21、自动舍弃。若被除数或除数有一个是小数则进行浮点数除法,结果为小数。取余运算符“%”,要求两个操作数必须是整数(int型或char型),其结果是第一个操作数除以第二个操作数所得的余数。“/”和“%”的优先级相同。2. 算术表达式的书写规则(1) 数学式子中的乘法和除法,在C语言中用运算符*和/表示。C语言不含乘方运算,当需要进行乘方运算时,可通过连乘的方式实现,也可以通过C编译系统提供的数学函数实现,如pow(x,y)表示xy。(2) 正确地使用优先级和结合性,运算符和结合性见表2.3。(3) 正确地使用圆括号,不仅可以改变优先顺序,而且还可以防止二义性的情况发生。3. 自动类型转换规则算术表达
22、式中可能含有不同类型的操作数的混合运算,如果含char型,将全部转换成int型;如果含有float型,将全部转换成double型;同类型的操作数运算后,结果仍为同类型;不同类型的操作数运算前,先将低精度类型转换成高精度类型,运算结果为高精度类型。数据类型自动转换规则见图2.9。高 double float unsigned long longunsigned unsigned short 低 int char,short图2.94. 强制类型转换规则当编程时需要某种数据类型时,可采用强制转换的方法,如1 /2的结果是0,而不是0.5,若写成(float)1/2,其值就是0.5。强制类型转换的一
23、般格式为(类型关键字)(表达式)例2.4 编写程序,在显示屏幕上显示下列表达式的值。(1)7/4+7.0/4+7/4.0+7.0/4.0(2)7%4+0%4+4%4(3)7*(8-6+4)%(5+3/2)-11 #include 2 int main( ) 3 4 printf(“%fn”, 7/4+7.0/4+7/4.0+7.0/4.0);5 printf(“%dn”, 7%4+0%4+4%4);6 printf(“%dn”, 7*(8-6+4)%(5+3/2)-1);7 return 0;8 该程序的输出结果是:6.2500003-1说明:(1) 在程序第4行的表达式7/4+7.0/4+7
24、/4.0+7.0/4.0中,7/4结果为1,舍弃小数部分;7.0/4、7/4.0和7.0/4.0结果均为1.75,则1+1.75+1.75+1.75的结果为6.25。(2) 在程序5行的表达式7%4+0%4+4%4中,7%4结果为3;0%4结果为0;4%4结果为0;则3+0+0的结果为3。 (3) 在程序第6行的表达式7*(8-6+4)%(5+3/2)-1中,先求第一个小括号内的子表达式8-6+4,加法与减法的优先级相同,左结合性,结果为6;再求第二个小括号内的子表达式5+3/2,除法的优先级高于加法,结果为6。此时表达式变为7*6%6-1,结果为-1。(4)如果用程序组件表示程序的话,例2.
25、4程序所用的组件有:预处理命令、main( )、输出函数、return 0;。请将这些组件按照程序流程进行排序,并根据正确排序的结果写出该程序。练习2.10 编写程序,从键盘输入两个整数,在显示屏幕上显示下列表达式的值。 (a+b)+(a-b)+(a/b)+(a*b)+(a%b)练习2.11 编写程序,从键盘输入圆的半径r的值,求圆的面积s和周长c的值。练习2.12 编写程序,从键盘输入x和y的值,求下列数学式子的值。xx+y+1xy2.2.3 自增和自减运算所谓自增和自减运算即对变量自身的当前值增1和减1,然后再将结果重新赋给同一个变量。前置和后置(如+i和i+)在没有参与其他操作时,情况相
26、同,都表示i=i+1。但当它们的结果要被用来继续参与其他操作时,前置(如+i)就表示“先加后做”,即先将变量的值加1,再使用i的值。而后置(如i+)就表示“先做后加”,即先使用i的当前值,再将变量的值加1。 -i和i-的用法同+i和i+。例2.5 看程序写结果。1 #include 2 int main( ) 3 4 int i,j;5 i=3;6 j=i+;7 printf(i=%d,j=%dn, i,j);8 i=3;9 j=+i;10 printf(i=%d,j=%dn, i,j);11 return 0;12 该程序的输出结果是:i=4,j=3i=4,j=4说明:(1) 程序第6行j=
27、i+;,先将i的值3赋给j,此时j为3,然后把变量i的值加1,此时i的值为4。程序第7行,输出函数printf的输出是:i=4,j=3。(2) 程序第8行i=3,重新给i赋值,此时i中存放的是3。程序的第9行j=+i;,先把变量i的值加1,此时i为4,然后把该值赋给j,此时j为4。程序第10行,输出函数printf的输出是:i=4,j=4。(3)注意:内存是“喜新厌旧”的,内存和变量值示意图见图2.10。内存i j变量图2.103 4 3 43 4练习2.13 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=6,j=4,m,n;i+;j-;m=+i;n
28、=-j;printf(i=%d,j=%dn, i,j);printf(m=%d,n=%dn, m,n);return 0;练习2.14 阅读下列程序,该程序的输出结果是 ,其数据类型为 。#include int main( ) char c=a; int i=10; unsigned int j=12;long int k=24;float f=6.0;double d=12.0;printf(%lfn, c/i+i*k-(j+k)*(f-d)/(f-i);练习2.15 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=7,j=3,k=2; float
29、 f=2.7,m=4.7,n=3.6;printf(%fn, f+i%3*(int)(f+m)%2/4);printf(%dn, (j+k)%2+(int)f/(int)n);2.2.4 赋值运算符与赋值表达式赋值运算符“=”是一种二元运算符,必须连接两个操作数,其作用是把一个表达式的值赋给一个变量(或数组元素)。赋值运算符的优先级比算术运算符低,赋值运算符具有右结合性。用赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。在赋值表达式的尾部加上一个分号就构成了赋值语句。1. 赋值表达式的一般形式变量(左值)= 表达式(右值)表达式(或常量)的值是右值,只能出现在赋值运算符右侧。变量
30、、数组元素是左值,赋值运算符要求它的左操作数必须是左值。在将右值赋给左值的赋值过程中,计算机系统将自动地将赋值运算符右侧的表达式的类型转换成左侧变量的类型,再进行给变量赋值的操作。注意:左值可以作为右值,但右值不能作为左值,8=x;和 x+y=8;是错误的。2. 复合算术赋值运算符由算术运算符与赋值运算符“=”构成了复合算术赋值运算符 +=、-=、*=、/=和%=,它们具有算术运算和赋值双重功能。a+=b等价于a=a+ba-=b 等价于a=a-ba*=b 等价于a=a*ba/=b 等价于a=a/ba%=b等价于a=a%b例2.6 看程序写结果。1 #include 2 int main( )
31、3 4 int i; char c; float f;5 f=2.6;6 c=f;7 i=c; 8 I*=7+2;9 printf(%d,%d,%fn, i,c,f);10 return 0;11 该程序的输出结果是:18,2,2.600000说明:(1) 程序第5行,计算f=2.6时,先将常数(双精度)转换成float型,再赋给变量f;在程序第6行,计算c=f时,先将 f中的数据(单精度)转换成char型,再赋给变量c;在程序第7行,计算i=c时,先将 c中的数据(字符型)转换成int型,再赋给变量i。(2) 使用复合赋值运算符时,要将右边的表达式作为一个整体与左边的变量进行运算。在程序第8
32、行,i*=7+2表示i=i*(7+2)。 (3) 该例题中有关数据类型的转换有可能将高精度类型转换成低精度类型,也有可能将低精度类型转换成高精度类型。在编译该程序时会出现“警告”信息,但仍然能显示运行结果。遇到这种情况建议使用强制类型转换。练习2.16 阅读下列程序,该程序的输出结果是 。#include int main( ) int i;double d=123.456;i=(int)d;i+=8;printf(i=%d,d=%fn, i,d);return 0;练习2.17 阅读下列程序,该程序的输出结果是 ,其数据类型为 。#include int main( ) int i=10;i
33、+=i-=i*i;printf(i=%dn, i);return 0;练习2.18 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=7,j=3,k=1;k-=j+=i;printf(%d,%d,%dn,i,j,k);return 0;2.2.5 关系运算符与关系表达式C语言中的关系运算符有6种(见表2.3),用来表示两个操作数之间的大小或相等关系。其作用主要是对两个算术表达式或赋值表达式进行比较运算。关系运算符的优先级比算术运算符低,但高于赋值运算符。关系运算符具有左结合性。用关系运算符将两个表达式连接起来的式子称为关系表达式。1. 关系表达式的值关系
34、表达式的值是两个算术表达式或赋值表达式进行比较的结果,是一个逻辑值。关系成立,结果为“真”,用整数“1”表示;关系不成立,结果为“假”,用整数“0”表示。2. 字符的比较对字符的比较实际上是对字符的ASCII码的比较。3. 浮点数的比较应该避免直接对浮点数进行等于或不等于的比较,以免发生两个本来应该相等的浮点数因为浮点数的误差而造成不相等的情况。例2.7 看程序写结果。1 #include 2 int main( ) 3 4 int i=0,j=2,k=4,d; 5 printf(%d , ij);6 printf(%d , 2+j=k);7 printf(%d , j+ki);8 print
35、f(%d , ab);9 printf(%d , d=ijk);10 printf(%d , 0=ij结果为0,表示“假”。(2)程序第6行,计算2+j=k时,先计算2+j 的值(算术运算符的优先级高于关系运算符),再和k进行比较,结果为1,表示“真”。(3)程序第7行, j+ki结果为1,表示“真”。(4)程序第8行,计算ab时,实际上是对字符a和字符b的ASCII码进行比较。a的ASCII码的十进制值是97,b的ASCII码的十进制值是98,9798的值为0,表示假。(5)程序第9行,由于关系运算符的优先级高于赋值运算符,因此,计算d=ijk时,先计算ijk。又由于关系运算符具有左结合性,
36、因此计算ijk等价于计算(ij)k,ij的结果为0,0k的结果也为0,最终d的值为0,表示“假”。(6)程序第10行,计算0=i=2时,先计算0=i,结果为1,再计算1=2,结果为1,表示“真”。(7)程序第11行,计算d=k=j+时,先做(把j的值赋给k)后加(变量j加1),得到d=2,k=2,j=3,输出2。练习2.19 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=8,j,k; j=k=i+;i=j=k;printf(%d,%d,%d,i+=+j-k-,i,(ij)=(k=i-1);return 0;练习2.20 阅读下列程序,该程序的输出结果
37、是 。#include int main( ) int i=10,j;i+=j=3;j=i+j4;printf(i=%d,j=%dn, i,j);return 0;练习2.21 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=7,j=3,k=1;i=k/i+j=i*4;printf(%d,%d,%dn,i,j,k);return 0;2.2.6 逻辑运算符与逻辑表达式C语言中的逻辑运算符有3种,即 “&”、“|”和“!”,分别表示逻辑“与”、逻辑“或”和逻辑“非”。“&”和“|”为二元运算符,要求两个操作数。“!”为一元运算符,要求一个运算符。逻辑运算
38、符必须连接的是逻辑量,其运算结果也是逻辑量,即只能取1(代表真)和0(代表假)。逻辑运算的真值表见表2.4,其中假设a和b是关系表达式或布尔值。表2.4 逻辑运算的真值表aba&ba|b!a!b000011010110100101111100在这3种逻辑运算符中,逻辑“非”(!)的优先级最高,逻辑“与”(&)高于逻辑“或”(|)。逻辑运算符处于不同的优先级,逻辑“非”(!)高于算术运算符,逻辑“与”(&)和逻辑“或”(|)低于关系运算符,而高于赋值运算符。逻辑“非”(!)具有右结合性,而逻辑“与”(&)和逻辑“或”(|)具有左结合性。用逻辑运算符将关系表达式或其他逻辑量连接起来的式子称为逻辑表
39、达式。1. 逻辑表达式的值一个逻辑表达式可含有多个运算符,如算术运算符、关系运算符、赋值运算符等,应该按各种运算符的优先级和结合性计算逻辑表达式的值。C语言规定任何非0值都被视为逻辑真,0被视为逻辑假。2. &和|的“短路”情况计算(表达式1)&(表达式2)时,先计算表达式1,如果其值为逻辑假,其后的表达式2就不计算了,因为只要有一个表达式的值为假,那么整个表达式的值就为假。仅当计算表达式1为真时,才需计算表达式2。同样,计算(表达式1)|(表达式2)时,先计算表达式1,如果其值为逻辑真,其后的表达式2就不计算了,因为只要有一个表达式的值为真,那么整个表达式的值就为真。仅当计算表达式1为假时,
40、才需计算表达式2。例2.8 看程序写结果。1 #include 2 int main( )3 4 int i=4,j=5,k=5; 5 printf(%d, k=j4&2|9k-!i);6 printf(%dn, k=i=0&j/i0);7 return 0;8 该程序的输出结果是:1,0说明:(1)程序第5行,计算k=j4&0|9k-!i时的步骤如下(参见图2.11): K = j 4 & 0 | 9 k - !i 1 00 5111 图2.11 !i,其值为0; 计算k-,即计算k-0,其值为5; 计算j4,其值为1; 计算9,即计算95,其值为1; 计算 &0,即计算1&0,其值为0;
41、计算|,即计算0|1,其值为1; 计算k=,即计算k=1,k的值为1。(2)程序第6行,计算k=i=0&j/i0时,,计算i=0的值为0,此时,&后面的j/i0就不计算了,将0赋给k,k的值为0。练习2.22 写出判断正奇数的逻辑表达式。练习2.23 写出判断字符变量c的值为英文字母的逻辑表达式。练习2.24 写出判断整型变量year的值为闰年的逻辑表达式。2.2.7 条件运算符与条件表达式C语言中的条件运算符是由“?”和“:”两个符号组成,是C语言中唯一的一个三元运算符,要求3个操作数。条件运算符连接3个表达式,构成条件表达式。条件表达式的一般形式为表达式1?表达式2表达式3先计算表达式1的
42、值,如果为真(非0值),则计算表达式2的值,此时表达式2的值即是整个条件表达式的值。如果表达式1的值为假(0值),则计算表达式3的值,此时表达式3的值即是整个条件表达式的值。条件运算符的优先级高于赋值运算符,低于算术运算符、关系运算符和逻辑运算符,具有右结合性。例2.9 编写程序,要求用条件运算符改写例2.3。1 #include 2 int main( ) 3 4 char c1,c2;5 scanf(%c,&c1);6 c2=c1=a&c1=z?c1-32:c1;7 printf(%cn,c2);8 return 0;9 该程序的输出结果是:a A 65说明:(1)程序第6行,赋值运算符右
43、边的条件表达式c1=a&c1=a&c1=z的值为“假”,则条件表达式的值为c1,直接将c1的值赋给c2,即不进行转换。(2)如果用程序组件表示程序的话,例2.9程序所用的组件有:预处理命令、main( )、定义变量赋初值、输入函数、计算并赋值、输出函数、return 0;。请将这些组件按照程序流程进行排序,并根据正确排序的结果写出该程序。练习2.25 编写程序,从键盘输入一个大写字母,在显示屏幕上显示对应的小写字母,要求用条件运算符实现。练习2.26 编写程序,从键盘输入一个小写字母,在显示屏幕上显示对应的大写字母。若从键盘输入的是大写字母或其他字符,则不做转换,并把它们显示出来。练习2.27
44、 编写程序,从键盘任意输入一个x的值,计算并输出相应的f(x)的值。F(x)= -1 (x0)2.2.8 逗号运算符与逗号表达式C语言中的逗号运算符有两种作用:一是作为分隔符将多个变量、输出项或输入项等隔开,并作为一个整体处理;二是作为运算符将多个表达式连接起来并作为一个整体处理。用逗号运算符将多个表达式连接起来的式子称为逗号表达式。逗号表达式的一般形式为表达式1,表达式2,表达式n 先计算表达式1的值,然后计算表达式2的值,从左到右依次计算,最后计算表达式n的值。表达式n的值即是整个逗号表达式的值。逗号运算符的优先级处于赋值运算符之后,低于所有运算符,具有左结合性。例2.10 看程序写结果。
45、1 #include 2 int main( )3 4 int i,j,k,d; 5 printf(%dn,j=(i=3*5,i*4,i+5);6 printf(%dn,k=(i=10,k=11,d=12);7 printf(%d,%dn,i,d=(i=10,j=(i=i-5,60/i);8 return 0;9 该程序的输出结果是:20125,10说明:(1) 程序第5行,计算j=(i=3*5,i*4,i+5)时,首先计算圆括号内的逗号表达式i=3*5,i*4,i+5,第一个表达式i=3*5的值为15(先做3*5,再赋给变量i);第二个表达式i*4,其值为60;第三个表达式i+5的值为20,
46、最后一个表达式的值20作为圆括号内的整个逗号表达式的值。把该值赋给j,j为20,输出j的值20。(2)程序第6行,计算k=(i=10,k=11,d=12),首先计算圆括号内的逗号表达式i=10,k=11,d=12,该逗号表达式相当于i=10;k=11;d=12;,即用一个逗号表达式代替了多个赋值表达式语句。 (3)程序第7行,计算d=(i=10,j=(i=i-5,60/i),首先计算圆括号内的逗号表达式i=10,j=(i=i-5,60/i),其值为12,将12赋给d。输出i为5,d为12。练习2.28 阅读下列程序,该程序的输出结果是 。#include int main( ) int i,j
47、,k; printf(%d,i=(4+5,9+10,14+15);printf(%dn,j=(k=10,k+12);return 0;练习2.29 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=10,j=11,t; t=i,i=j,j=t;printf(i=%d,j=%d,i,j);return 0;练习2.30 阅读下列程序,该程序的输出结果是 。#include int main( ) int i=2,j=4,k;k=(i+,i+=j,i+j);printf(%d,%d,%dn,i,j,k);return 0;2.2.9 长度运算符C语言中的长度
48、运算符sizeof用来计算某数据类型的值在内存中存储所需占用的字节数。它的一般形式为sizeof(数据类型名) sizeof运算符也可以用于变量、常量和表达式。若有int a,b;,则sizeof(double)、sizeof(2*3.14/4)、sizeof(a)和sizeof(a+b)具有相同的计算结果。Sizeof是一元运算符,所有的一元运算符都具有相同的优先级,均具有右结合性。例2.11 看程序写结果。1 #include 2 int main( )3 4 int i,j,k,d; 5 printf(double: %dn, sizeof(double);6 printf(int: %dn, sizeof(int);7 printf(float: %dn, sizeof(float);8 printf(char:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土建劳务分包合同范本
- 外架拆除合同协议模板
- 培训学校代理合同范本
- 园林托管养护合同范本
- 土地流转政策合同范本
- 国土出让合同变更协议
- 基地合作协议合同范本
- 地摊货品转让合同范本
- 墓穴安装架墓合同范本
- 国企业划转协议书模板
- 补签的劳动合同范本
- 粮油保管员考试题库汇总
- 基于lora通信的温室大棚环境监测系统
- 人工智能就业影响及研究进展
- 石油储罐呼吸阀检测原始记录
- GB/T 20113-2006电气绝缘结构(EIS)热分级
- GA/T 1717.2-2020信息安全技术网络安全事件通报预警第2部分:通报预警流程规范
- 2022年中国建银投资有限责任公司招聘笔试试题及答案解析
- 2022年邢台银行校园招聘试题题库及答案解析
- 金坛区苏科版六年级上册劳动《05土培吊兰》课件
- 双溪课程评量表(共36页)
评论
0/150
提交评论