C语言课件第03章.ppt

上传人:sccc 文档编号:5384441 上传时间:2023-07-02 格式:PPT 页数:60 大小:259.01KB
返回 下载 相关 举报
C语言课件第03章.ppt_第1页
第1页 / 共60页
C语言课件第03章.ppt_第2页
第2页 / 共60页
C语言课件第03章.ppt_第3页
第3页 / 共60页
C语言课件第03章.ppt_第4页
第4页 / 共60页
C语言课件第03章.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《C语言课件第03章.ppt》由会员分享,可在线阅读,更多相关《C语言课件第03章.ppt(60页珍藏版)》请在三一办公上搜索。

1、第3章 运算符和表达式,3.1 表 达 式3.2 运算符及表达式3.3 运算符优先级和结合性,3.1 表 达 式,C语言的表达式分为基本表达式和复杂表达式。基本表达式是由以下单项构成的,即:标识符、常量、字符串字面量和用圆括号括起来的表达式。将基本表达式通过运算符连接在一起,就构成复杂表达式。例如:28,ab,(xy)/a等。由表达式还可组成更大的表达式。例如:x(ab)10,3.2 运算符及表达式,运算符是在一个数学运算中表示相应运算动作的一种符号。运算符所作用的对象称作运算分量。,3.2.1 算术运算符和算术表达式在C语言中,基本算术运算符有5个,它们是:(加)(减)*(乘)/(除)(取模

2、)算术运算符和运算分量组成的求值序列称作算术表达式。要注意运算符“/”和“”的区别。运算符“/”可以作用于算术类型。运算符“”却只能作用于整型量。a/b表示两个整数进行整除,其结果是舍弃余数后所得到的商值。是取整数除法的余数,而不管商的值是多少。,例3-1:算术运算符应用示例。/*arithmetic practice*/#include void main()int a99;int b5;int c11;int d3;int result;resultab;,printf(abdn,result);resultb*c;printf(b*cdn,result);resulta/b;printf

3、(a/bdn,result);resultab;printf(abdn,result);resultadb/c;printf(adb/cdn,result);,输出结果是:ab94b*c55a/b19ab4adb/c0,例3-2:计算有多个算术运算符的算术表达式。#include void main()int x,a3;float y;x2025/5*2;printf(1)xdn,x);x25/2*2;printf(2)xdn,x);xa4*56;,printf(3)xdn,x);xa456;printf(4)xdn,x);x3*46/5;printf(5)xdn,x);x(76)5/2;pr

4、intf(6)xdn,x);y25.0/2.0*2.0;printf(7)yfn,y);,输出结果是:(1)x30(2)x24(3)x11(4)x1(5)x0(6)x1(7)y25.000000,3.2.2 赋值运算符和赋值表达式赋值运算符“”,其简单的使用形式是:变量表达式 这种形式的整个表达式称作赋值表达式。在使用赋值表达式时应注意以下几点:在赋值运算符左边的量(通常称为左值)必须是变量,不能是常量或用上述运算符结合起来的表达式。int a,b;ab;b8;是正确的赋值形式;6a;ab14;等形式都是不对的。,赋值运算可连续进行。例如,abc0 a(b(c0)赋值运算符的优先级比上述运算符

5、的优先级都低。a(b9)*(c7)赋值表达式的值等于右边表达式的值,而结果的类型由左边变量的类型决定。,除了上述基本的赋值运算符之外,C语言中还提供了另外10个赋值运算符,它们是:*&这些运算符是把“运算”和“赋值”两个动作结合在一起,往往把它们称为复合赋值运算符。x 2其等效形式是:xx2。表达式 x*y5的等效形式是:xx*(y5)。而表达式 x y10的等效形式是:xx(y10)复合赋值运算符右边的表达式应作为一个整体对待。,3.2.3 增量运算符和增量表达式自增运算符“”和自减运算符“”。它们都是单目运算符。当出现在运算分量的前面时,例如i、i,就称之为前缀运算符;当出现在运算分量的后

6、面时,例如x、y,就称之为后缀运算符。由增量运算符和运算分量构成的表达式称为增量表达式。1自增运算符 n这个表达式执行后,n的值增1。还可采用“后缀加”的形式:n但必须指出,并非在任何情况下二者都等价。,例3-3:显示前缀加和后缀加的区别。#include void main()int a,b,c;a9;ba;,printf(1)ad*bdn,a,b);a9;ca;printf(2)ad*cdn,a,c);运行后输出的结果是:(1)a10*b10(2)a10*c9,执行ba,这条语句等价于下述两条语句:ca1;ba;而改为后缀加形式,即:ca,这条语句等价于下述两条语句:ca;aa1;简而言之

7、,在表达式中出现前缀加的情况下,前缀加所作用的运算分量值先增1,然后进行其他级别较低的运算;而在表达式中出现后缀加的情况下,先以其运算分量的当前值参与其他级别较低的运算,最后该运算分量值才增1。,例3-4:复合赋值符和自增运算符“”的应用。Void main()int x2,y,z;x*32;printf(1)xdn,x);x*yz4;printf(2)xdn,x);xy1;zx 1;,printf(3)xd*zdn,x,z);zx*y;printf(4)xd*yd*zdn,x,y,z);输出结果是:(1)x10(2)x40(3)x2*z0(4)x3*y2*z4,2自减运算符“n”就等价于:n

8、n1它也分前缀减和后缀减两种形式。mn;等价于:nn1;mn;而 mn;却等价于:mn;nn1;,在使用增量运算符时,还应注意以下几点:增量运算符有副作用。就是说,增量运算符作用于运算分量时,如“a”,不仅可以向外提供一个值,而且还改变运算分量自身的值。例如:xii或者 xi(i)“”和“”是单个运算符,不是通常意义上的两个“加”号或者两个“减”号。,xij;是理解成(i)j,还是i(j)呢?C语言词法分析遵循“最长匹配”原则,即:如果在两个运算分量之间连续出现多个表示运算符的字符(中间没有空格),那么,在保证有意义的条件下,就从左到右尽可能多地将若干个字符组成一个运算符。所以,表达式就解释为

9、(i)j,而不是i(j)。建议读者在录入程序时,在各个运算符之间加入空格,或者使用圆括号,把有关部分括起来,使之作为整体处理。,“”和“”只能作用在变量上,如“”,“”等,而不能用于常量和一般表达式(不是左值的表达式)。另外,增量运算符与运算分量结合在一起构成的表达式带有自身赋值含义,但这种表达式不是左值,不能直接出现在赋值号左边。,3.2.4 关系运算符和关系表达式C语言有完整的一组关系运算符,用于比较两个运算分量间的大小关系。这组运算符有6个,即:!用关系运算符将两个运算分量连在一起构成的表达式称作关系表达式。根据运算符所作用的两个运算分量之间的指定关系是否成立,分别得到关系表达式的“真”

10、、“假”结果。,在C语言中,没有表示“真”、“假”的逻辑量TRUE(真)和FALSE(假),就借用数值来表示。以数值0表示“假”,以非0值表示“真”。对于关系表达式来说,结果的真、假分别用1和0表示。关系运算只判定两个运算分量是否满足指定的关系,而不理睬二者具体数值相差多少。应注意,赋值号“”与全等比较运算符“”的区别。关系运算符的优先级低于算术运算符。abcd应理解为:(ab)(cd)前4个关系运算符的优先级相同,后两个相等比较运算符的优先级也相同。但前者的优先级恰好比后者高一级。,例3-4:分析下面程序的运算结果。1 void main()2 3 int a,b,c;4 abc10;5 a

11、b c;6 printf(ad,bd,cdn,a,b,c);7 a(bc*2);8 printf(ad,bd,cdn,a,b,c);9 abc100;10 printf(ad,bd,cdn,a,b,c);11,上述程序运行之后的输出结果是:a1,b10,c10a1,b20,c11a0,b20,c11,3.2.5 条件运算符和条件表达式C语言中提供的条件运算符“?:”是惟一的三目运算符。由条件运算符组成的表达式简称为条件表达式,或三目表达式。其一般构成形式是:表达式1?表达式2:表达式 3决定条件表达式值的方法是:先计算表达式1的值;若该值不为0,则计算表达式2的值,并将表达式2的值作为整个条件

12、表达式的值;否则,就计算表达式3的值,并将该值作为整个条件表达式的值。,例如,要求出x和y中最大的一个,并赋予变量max。max(xy)?x:y;使用条件运算符时,还要注意以下几点:条件运算符的优先级稍高于赋值运算符,但比其他运算符的优先级都低。三个运算分量不限于简单的算术表达式,甚至可以是函数调用。分析条件表达式时,关键是先找出“?”和“:”,把三个运算分量区分开,然后按一般方法进行计算。,例3-5:分析下面程序运行的结果。1 void main()2 3 int a,b,c;4 abc1;5 a b;6 b c;7 c a;8 printf(1)dn,ab?a:b);9 printf(2)

13、dn,ac?a:c+);10(abc)?printf(AA):printf(CC);11 printf(n ad,bd,cdn,a,b,c);12,3.2.6 逗号运算符和逗号表达式在C语言中,逗号的用途主要有两种:一是作为分隔符,二是作为运算符。(1)逗号分隔符用来分开相应的多个数据。int a,b,c;printf(Adt Bdn,a,b);,(2)逗号运算符逗号作为运算符时,是把两个运算分量“连接”起来,使之构成一个逗号表达式。逗号表达式的一般形式是:表达式1,表达式2它的执行过程是:先计算表达式1,然后计算表达式2。整个逗号表达式的值是表达式2的值。逗号表达式的扩展形式是:表达式1,表

14、达式2,表达式n各个表达式必须从左到右顺序执行,而整个逗号表达式的值是其中最右边表达式的值。x(i10,j5,i*j)逗号运算符在所有运算符中是级别最低的。,3.2.7 逻辑运算符和逻辑表达式C语言中逻辑运算符有3个,它们是:!逻辑非(相当于其他语言中的NOT)&逻辑与(相当于其他语言中的AND)|逻辑或(相当于其他语言中的OR)其中,“!”是单目运算符,而&和|是双目运算符。,由逻辑运算符和运算分量构成的表达式称为逻辑表达式。(1)逻辑非运算符!作用在单个运算分量上,其结果是运算分量逻辑值的“反”。(2)逻辑与运算符&作用在前后两个运算分量上,其结果是:仅当两个运算分量同时为真时,结果才为真

15、;否则,只要其中有一个为假,结果就为假。,(3)逻辑或运算符|作用在前后两个运算分量上,其结果是:只要其中有一个运算分量为真,结果就为真;仅当二者同时为假时,结果才为假。这三个逻辑运算符的优先级是:!的优先级高于&的优先级,&的优先级又高于|的优先级。,例3-7:判断给定的某一年是否是闰年。什么是闰年呢?如果某年号能被4整除而不能被100整除,或者能被400整除,那么这年就是闰年;否则就是平年。下面的程序对用户输入的年号判别是否是闰年。1/*determing if a year is a leap year*/2#include 3,4 Void main()5 6 int year,lea

16、p;7 printf(Input your year.n);8 scanf(d,&year);9 leapyear40&year 100!0|year 4000;10 if(leap)11 printf(d is a leap year.n,year);12 else13 printf(d is not a leap year.n,year);14,在使用逻辑运算符时应注意以下几点:用逻辑运算符把运算分量连接起来就构成逻辑表达式。其运算分量可以是关系表达式、算术表达式等,甚至还可以是逻辑表达式。!的优先级高于算术运算符的优先级。运算符!的结合性是从右到左,而&和|的结合性是从左到右。逻辑表达式

17、的值只有两个:0和1。以0代表逻辑结果为假;以1代表逻辑结果为真。,运算符&和|保证左边的运算分量优先得到计算。就是说,由&和|构成的逻辑表达式严格地从左到右进行计算,并且一旦根据左分量的值就能确定整个逻辑表达式的值时,就不再执行后面的运算。例如,xyz1;x|y&z;执行之后,x、y和z的值分别是2,1,1。,3.2.8 位逻辑运算符和位逻辑表达式1二进制只用0和1两个数字来表示所有的数。二进制数的基本规则是“逢二进一”。2八进制和十六进制八进制数是以8为基底的数,用到的数字是0,1,2,7,一共8个。它的基本进位规则是“逢八进一”。八进制整常数是以数字0开头的八进制数字串。二进制数与八进制

18、数之间很容易进行转换。对于一个二进制数来说,从右向左每三个数字为一组分开,把每组二进制数转为八进制数表示。,将八进制数转换成二进制数时,只要将每位八进制数字用三位二进制数表示,串起来就是相应的二进制数。十六进制数是以十六为基底的数,它由数字0,1,2,9和字母A,B,C,D,E,F(或者a,b,c,d,e,f)来表示。其基本进位规则是“逢十六进一”。在C语言中,十六进制整常数是以0 x或0X开头的十六进制数字串,例如0 x12、0X5a8。二进制与十六进制的转换也很容易:对于一个二进制数来说,从右向左每四个数字为一组,把每组二进制数用十六进制数字表示。把十六进制数的每一位数字用四位二进制数表示

19、,串起来就是相应的二进制数。,3原码、反码和补码在计算机内表示数值的方法是不同的,一般有:原码、反码和补码。(1)原码通常,整数用一个字长表示。一般用最左边的一位(称作最高位)表示数的符号:以0代表正,1代表负。二进制数的原码表示形式是:最高位用于符号位,其余各位是数值的绝对值。,(2)反码正数的反码与原码相同。负数的反码是:原码除符号位外(仍为1),各位取反。(3)补码正数的补码与原码相同。除最高位仍为1外,原码的其余各位求反,最后再加1,4位逻辑运算符和位逻辑表达式在C语言中,位逻辑运算符有以下4个:&(按位与)|(按位或)(按位反)(按位异或)它们都是按二进制一位一位地进行运算,相邻位之

20、间不发生联系,即没有“进位”、“借位”等问题,所以称为位逻辑运算符。,各个位逻辑运算符的优先级关系是:最高,其余3个运算符的优先级从高到低依次是&、|,但三者都高于逻辑运算符而低于关系运算符。由位逻辑运算符和运算分量构成的表达式称作位逻辑表达式。位逻辑运算符与逻辑运算符之间的区别:位逻辑运算符是针对二进制位的,而逻辑运算符是针对整个表达式的;位逻辑运算符要计算表达式的具体数值,而逻辑运算符只判别表达式的真与假。位逻辑运算符&、|和 的两个运算分量是可交换的;而逻辑运算符&和|的两个运算分量都是不可交换的,并且它们严格从左到右运算。,3.2.9 移位运算符和移位表达式C语言中实现移位功能的运算符

21、有两个:(左移)和(右移)。它们都是双目运算符,并且要求两个运算分量都是整型量。由移位运算符和运算分量构成的表达式称作移位表达式。(1)左移运算符它的一般使用形式是:表达式1表达式2它的功能是:把表达式1的值(以二进制形式表示)向左移动n位,n值由表达式2确定,并且表达式2的值必须是正整数。,例如,a 00001011,那么,移位表达式 a3的结果是01011000,即:把a的各二进位全部向左移3位,右边空出的位补0,而左边溢出的位被丢弃不管。,(2)右移运算符 它的一般使用形式是:表达式1表达式2它的功能是:把表达式1的值(以二进制形式表示)向右移n位,n的值由表达式2确定(该值必须是正整数

22、)例如,a00001011,那么,移位表达式 a3的结果是00000001,即:把a的各二进位全都向右移3位,右边溢出的位被丢弃,而左边空出的位(在本例情况下)补0。在右移时,要注意符号位问题。,3.2.10 其他运算符(1)&和*单目运算符&用来取出其运算分量的地址,例如,int a,*p;p&a;“*”也是单目运算符,它是“&”的逆运算。它把运算分量(应是指针量)所指向的内存单元中的内容取出来。例如,b*p;,(2)强制类型运算符()一般使用形式是:(类型名)表达式它把表达式的类型强制转换成圆括号中“类型名”所指定的类型。(double)a这是类型的临时转换方法。(3)sizeof单目运算

23、符sizeof用来计算某种类型的变量或某种数据类型在计算机内部表示时所占用的字节数。例如:sizeof(int),(4)单目加“”和单目减“”运算符单目加“”运算的结果仍是其运算分量的值负号()的运算结果是其运算分量的负值(5)基本运算符()其中,用于数组下标的表示,()用于标识函数,“”和“”用于存取结构或联合中的成员。它们的优先级在所有运算符中是最高的。,3.3 运算符优先级和结合性,所有运算符的优先级共分为15级。基本运算符的优先级最高(为15),逗号运算符的优先级最低(为1)。当不同类型的运算符出现在一个表达式中,那么在计算该表达式的值时,应先执行优先级高的运算,再依次执行优先级低的运

24、算。x|y&bc该表达式就等价于:x|(y&(bc),表中同一行上的运算符有相同的优先级。如果它们出现在同一个表达式中,则按结合性的顺序进行计算。a b*c等价于:(ab)*c 在分析C源程序或者编写C程序时,要注意运算符的作用和其运算分量的个数。,3.3.2 运算符嵌套leap year4 0&year100!0|year400 03.3.3 表达式计算顺序在很多情况下,C语言中表达式的计算顺序是不确定的。应注意以下几点:掌握C语言中对各个运算符的优先级和结合性的规定。特别要注意区分具有同样外形而语义不同的运算符(如、*、&等)。C语言中有5个运算符保证计算顺序严格从左到右进行,它们是:&、

25、|、?:、,和函数调用运算符()。,在一个表达式中出现多个有不同优先级的运算符时,可以通过加圆括号的方式改变运算顺序,例如:(ab)*(c/d)为了强调某部分是作为一个“整体”参与运算,可以引用“中间变量”,把“整体”的值赋给这个变量,然后由这个变量参与有关运算。例如:t ab;x t*c;,例3-8:分析下面程序运行的结果。#include void main()int x,y1,z;x(96)59565)?1:0;printf(xdn,x);y zx3;,printf(ydt zdn,y,z);xyz1;&y|z;printf(xdt ydt zdn,x,y,z);运行结果如下:x0y4 z3x0 y1 z2,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号