资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3,章 运算符和表达式,3.1,运算符,运算符是表示各种不同运算的符号,参与运算的数据称为操作数。根据运算符所要求的操作数的个数,运算符分为,“,一元运算符,”,、,“,二元运算符,”,和,“,多元运算符,”,。,一元运算符,:,有一个操作数的运算符,比如,:,“,+,”,运算符、,“,-,”,运算符,二元运算符,:,有两个操作数的运算符,如,:,“,+,”,运算符、,“,-,”,运算符等。,三元运算符,:,有两个操作数的运算符。即,“,?,:,”,运算符,第,3,章 运算符和表达式,3.1,运算符,根据操作数的数据类型,,C#,的运算符又可以分为:,算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,其他运算符。,第,3,章 运算符和表达式,3.1,运算符,3.1.1,算术,运算符,C#,的算术运算符及其功能如表,3-1,所示。,表,3-1 C#,的算术运算符,名称,符号,描 述,加法运算符,+,也可称为正值运算符,如,5+8,,,+9,减法运算符,-,也可称为负值运算符,如,8-5,,,-9,乘法运算符,*,如5*8,除法运算符,/,整数相除的结果为整数,如,7/5,的结果为,1,,实数相除的结果为实数,如,7.0/5,的结果为,1.4,。,模运算符,%,也可称为求余运算符。“,%”,运算符两边操作数的数据类型必须是整数,如“,7%3”,的结果为,1,。符号与被除数一致,如,-7%3,的结果为,-1,,,7%-3,的结果为,1,。如果为实数则错误,如,7.0%3,。,自增运算符,+,如i+,自减运算符,-,如-i,第,3,章 运算符和表达式,3.1,运算符,3.1.2,赋值,运算符,C#,的赋值运算符及其功能如表,3-,2,所示。,表,3-2 C#,的,赋值,运算符,类型,符号,描 述,赋值运算符,=,a=1,复合赋值,运算符,+=,a+=1,等于,a=a+1,-=,a-=,1,等于,a=a-1,*=,a*=,1,等于,a=a*1,%=,a%=,1,等于,a=a%1,/=,a/=,1,等于,a=a/1,&=,a&=,1,等于,a=a&1,|=,a|=1,等于,a=a|1,=,a=,1,等于,a=a1,=,a=,1,等于,a=a1,=,a=1,等于,a=a,大于,=,大于等于,=,小于等于,!=,不等于,第,3,章 运算符和表达式,3.1,运算符,3.1.4,逻辑,运算符,C#,的,逻辑,运算符及其功能如表,3-,4,所示。,表,3-4 C#,的逻辑运算符,符号,描 述,&,逻辑与,|,逻辑或,!,逻辑非,第,3,章 运算符和表达式,3.1,运算符,3.1.5,位,运算符,位运算符表示了对操作数进行的位运算。位运算是指进行二进制位的运算。,C#,的,位,运算符及其功能如表,3-,5,所示。,表,3-5 C#,的位运算符,符号,描 述,按位取反,&,按位与,|,按位或,右移,按位异或,第,3,章 运算符和表达式,3.1,运算符,3.1.5,位,运算符,1,、按位取反运算符,(,),“,”,运算符是一元运算符,它对二进制数进行按位取反,即将二进制数的,0,转换为,1,,,1,转换为,0,。例如对整数,1,进行按位取反操作,结果可表示为:,1:00000000 00000000,00000000,00000001,1:11111111,11111111,11111111,11111110,对整数,-1,的取反操作为:,-1,:,11111111,11111111,11111111,11111111,-1,:,00000000,00000000,00000000,00000000,很明显,,1,和,-1,的值不相等,并且,1,和,-1,的值也不相等。取反是位运算,它和数值运算并不相同。,第,3,章 运算符和表达式,3.1.5,位运算符,2,、按位与运算符,(&),“,&,”,运算符是二元运算符,如果两个操作数相应的二进制位都为,1,,那么运算结果为,1,,否则结果为,0,。例如:,1&1,结果为,1,,,0&1,结果为,0,,,0&0,结果为,0,。,3,、按位或运算符,(|),“,|,”,运算符是二元运算符,如果两个操作数相应的二进制位中有一个是,1,,那么相应位的结果就是,1,,否则为,0,。例如:,1|1,的结果为,1,,,1|0,的结果为,1,,,0|0,的结果为,0,。,第,3,章 运算符和表达式,3.1.5,位运算符,4,、按位异或运算符,(),“,”,运算符也称为,XOR,运算符,它是二元运算符。,11 0,00 0,10 1,01 1,第,3,章 运算符和表达式,3.1.5,位运算符,5,、左移运算符,(),:,是二元运算符。,它将数的二进制位全部向左移动指定的位数,并在后面移入的空位填,0,,而前面的高位移出后会被舍弃。如:,对于,72,,就是把整数,7,所有的位向左移动,2,位,即:,7,:,00000000,00000000,00000000,00000111,7),:也,是二元运算符。,它将数的二进制位全部向右移动指定的位数,并在前面移入的空位填,0,,而后面的低位移出后会被舍弃。如:,对于,72,,就是把整数,7,所有的位向右移动,2,位,即:,7,:,00000000,00000000,00000000,00000111,72:00000000,00000000,00000000,00000001,特别注意:,在进行右移运算时,要注意符号位的问题。对于无符号数,右移时左边高位移入,0,。对于有符号的值,如果原来符号位为,0,(该数为正数),则左边也是移入,0,。如果原来符号位是,1,(该数为负数),则左边移入,0,还是,1,,要取决于所用的计,算机系统。有的系统移入,0,,有的移入,1,。移入,0,的称为,“,逻辑右移,”,,移入,1,的称为,“,算术右移,”,。,第,3,章 运算符和表达式,3.1.6,条件,运算符,条件运算符,(?,:),是一个三元运算符。条件运算符的一般格式为:,操作数,1?,操作数,2:,操作数,3,其中,操作数,1,的值必须为逻辑值。进行条件运算时,首先判断问号前面的逻辑值是真还是假,:,如果逻辑值为真,则条件运算表达式等于操作数,2,的值;,如果逻辑值为假,则条件运算表达式等于操作数,3,的值,例如条件表达式:,35?8:9,,由于,35,的值为假,所以表达式的值为,9,。,第,3,章 运算符和表达式,3.1.7,其它运算符,在,C#,中还有对象创建、类型信息、溢出检查运算符,如表,3-6,所示。,表,3-6 C#,的其他运算符,名称,符号,描 述,对象创建,new,创建对象和调用对象的构造函数,类型信息,is,检查操作数或表达式是否为指定类型,sizeof,获得值类型的长度,typeof,获取系统命名空间中的数据类型,溢出检查,checked,进行整数类型数据运算和类型转换时的溢出检查,unchecked,取消对整数类型数据运算和类型转换时的溢出检查,第,3,章 运算符和表达式,3.2,表 达 式,表达式是由操作数和运算符组成的符号序列。根据运算符类型的不同,表达式可以分为,:,算术表达式,赋值表达式,逻辑表达式,关系表达式,条件表达式,表达式在经过一系列运算后会得到一个结果,这就是表达式的结果。结果的类型由参加运算的操作数的数据类型决定。,第,3,章 运算符和表达式,3.2,表 达 式,1,、算术表达式,算术表达式是用算术运算符和括号将操作数(对象)连接起来的符合语法规则的式子,其中操作数可以是常量、变量,也可以是函数。,算术运算的优先级是,:,(,1,),+,(正号)、,-,(负号)、,+,(自加)、,-(,自减)为同级,属于,第一优先级;,(,2,)*、,/,、,%,为第二优先级;,(,3,),+,(加法)、,-,(减法)为第三优先级。,相同级别的优先级,遵循自左向右的顺序进行运算。,第,3,章 运算符和表达式,1,、算术表达式,如,A,的原值为,2,,则,6+A+,相当于,6+(A+),结果为,8,,运算后,A,的值为,3,;如果是针对表达式,6+A,,则相当于,6+(+A),A,先加,1,,为,3,,再与,6,相加得,9,。,第,3,章 运算符和表达式,3.2,表 达 式,2,、赋值表达式,由赋值,运算符将变量和表达式连接起来的式子称为赋值表达式,它的一般格式为:,变量 赋值运算符 表达式,对赋值表达式求解的过程就是将表达式的结果赋给变量。如赋值表达式“,x=10”,,,它的值与被赋值变量的值相同,都是,10,。在赋值表达式中,表达式又可以是赋值表达式。如:,b=(x=10+2),这个赋值表达式的值为,12,。由于赋值运算符的结合性是自右向左的,所以“,b=(x=10+2)”,和“,b=x=10+2”,是等价的。,第,3,章 运算符和表达式,3.2,表 达 式,3,、关系表达式:,用关系运算符将两个表达式连接起来的式子称为关系表达式,。,对关系表达式进行运算,也就是对参加运算的两个操作数进行比较,判断比较的结果是否满足关系运算符所描述的关系。,如果满足,则关系表达式的结果为真。,如果不满足,则结果为假。,关系表达式的值只有两个逻辑值,即真(,true,)或假(,false,)。,第,3,章 运算符和表达式,3.2,表 达 式,3,、关系表达式:,关系运算符的结合方向为自左向右。关系运算符的优先次序为:,、,=,的优先级别相同;,=,和,!=,的优先级别相同,但低于前,4,种,所有关系运算的优先级别都高于赋值运算符而低于算术运算符,。如下面的例子:,程序运行结果为:,True,True,False,第,3,章 运算符和表达式,3.2,表 达 式,4,、逻辑表达式,:,用逻辑运算符将关系表达式或者逻辑值连接起来的式子。,逻辑表达式的值应该是一个逻辑值,它只能取真或假。优先级:,“,逻辑非,”,最高,其次是,“,逻辑与,”,,最后为,“,逻辑或,”,。逻辑与,“,&,”,和逻辑或,“,|,”,的运算优先级低于关系运算符,高于赋值运算符。而逻辑非,“,!,”,的运算优先级高于算术运算符。括号内的表达式运算优先级最高。例如:,!(58)|(7=7|8=4,!False|True&2=7|8=4,True|True&2=7|8=4,True|True&False|True,True|False|True,最终结果:,True,第,3,章 运算符和表达式,3.2,表 达 式,5,、条件表达式,由条件运算符和操作数或表达式组成的式子,称为条件表达式。条件表达式的格式为:,操作数,1?,操作数,2:,操作数,3,其中,,操作数,1,:逻辑表达式,操作数,2”,及“操作数,3,:为任何符合要求的表达式。,当“操作数,1”,为真时,条件表达式的结果为“操作数,1”,的计算值,否则为“操作数,2”,的运算结果值。,第,3,章 运算符和表达式,3.2,表 达 式,5,、条件表达式,如下面的例子:,!(58)?5+13:20+8,结果为:,18,第,3,章 运算符和表达式,3.2,表 达 式,6,、多种运算符组成的表达式的运算,在对包含多种运算符的表达式求值时,如果有括号,先计算括号里面的表达式。在运算时各运算符执行的先后顺序需要根据各运算符的运算优先级和结合性确定。先执行运算优先级别高的运算,然后执行运算优先级别低的,最后得出表达式的结果。运算符的优先顺序,如表,3-7,所示。,表,3-7,运算符从高到低的顺序,第,3,章 运算符和表达式,3.2,表 达 式,6,、多种运算符组成的表达式的运算,当运算符两边的运算数的优先级别一样时,由运算符的结合性来控制运算执行的顺序除了赋值运算符,所有的二元运算符都是左结合,即运算按照从左到右的顺序来执行。赋值运算符和条件表达式运算符是右结合的,即运算按照从右到左的顺序来执行。,第,3,章 运算符和表达式,3.2,表 达 式,6,、多种运算符组成的表达式的运算,例表达式:,2+8+(2+(8-3)*4%3)-4,的计算步骤为:,2+8+(2+5*4%3)-4,2+8+(2+20%3)-4,2+8+(2+2)-4,2+8+4-4,计算结果为,10,,,再比如条件表达式:,39?8:79?8,:(79?8:10,最终结果为,10,,运算顺序是从右到左的。,例,1,表达式,using System;,using,System.Collections.Generic,;,using,System.Text,;,namespace Test01,class Program,static void,Main(string,args,),int,i=927;/,声明一个,int,类型的变量,i,并初始化为,927,int,j=112;/,声明一个,int,类型的变量,j,并初始化为,112,Console.WriteLine(Math.Sin(,i,*i+j*j,);/,表达式作为参数输出,Console.ReadLine,();,例,2,表达式,class Program,static void,Main(string,args,),int,M1=927;/,声明整型变量,M1,,并赋值为,927,int,M2;/,声明整型变量,M2,M2=M1+M1;/M2,的值为,M1,与,M1,相加之后的值,Console.WriteLine(M2.ToString();,decimal R1=(decimal)1112.82;/,声明整型变量,R1,,并赋值为,1112.82,decimal R2=(decimal)9270.81;/,声明整型变量,R2,,并赋值为,9270.81,decimal R3;/,声明整型变量,R3,R3=R2-R1;/R3,的值为,R2,减去,R1,得到的值,Console.WriteLine(R3.ToString();,Console.Read,();,例,3,赋值运算符,using System;,using,System.Collections.Generic,;,using,System.Text,;,namespace Test07,class Program,static void,Main(string,args,),int,i=927;/,声明一个,int,类型的变量,i,并初始化为,927,i,+=,112;/,使用加赋值运算符,Console.WriteLine,(,最后,i,的值为:,0,i);/,输出最后变量,i,的值,Console.ReadLine,();,例,4 is,运算符,using System;,using,System.Collections.Generic,;,using,System.Text,;,namespace Test22,class Program,static void,Main(string,args,),int,i=0;/,声明整型变量,i,bool,result=i is,int,;/,判断,i,是否为整型,Console.WriteLine(result,);/,输出结果,Console.ReadLine,();,例,5 new,运算符,namespace Test24,class Program,static void,Main(string,args,),string,ls,=new string5;/,创建具有,5,个元素的,string,类型数组,ls0=ls1;/,为数组第一项赋值,ls1=ls2;/,为数组第二项赋值,ls2=ls3;/,为数组第三项赋值,ls3=ls4;/,为数组第四项赋值,ls4=ls5;/,为数组第五项赋值,Console.WriteLine(ls0);/,输出数组第一项,Console.WriteLine(ls1);/,输出数组第二项,Console.WriteLine(ls2);/,输出数组第三项,Console.WriteLine(ls3);/,输出数组第四项,Console.WriteLine(ls4);/,输出数组第五项,Console.ReadLine,();,例,5,typeof,运算符,using System;,using,System.Collections.Generic,;,using,System.Text,;,namespace Test25,class Program,static void,Main(string,args,),Type,mytype,=,typeof(int,);/,获取引用类型的信息,Console.WriteLine,(,类型:,0,mytype,);/,输出结果,Console.ReadLine,();,小 结,介绍了,C#,的各种运算符。,介绍了,C#,的各种表达式的类型以及它们运算的优先顺序。,
展开阅读全文