《第4章运算符与表达式.ppt》由会员分享,可在线阅读,更多相关《第4章运算符与表达式.ppt(57页珍藏版)》请在三一办公上搜索。
1、第4章 运算符与表达式,4.1 引言4.2 单目运算符4.3 双目运算符4.4 三目运算符4.5 其他运算符4.6 标点符号4.7 运算符优先级4.8 正则表达式4.9 小结,4.1 引言,C#提供了多种数据类型,以满足各种数据存储的需要,同时也提供了多种运算符来满足处理、计算数据的需要。根据处理操作对象的个数不同,运算符大致分为三类。单目运算符,又称一元运算符;双目运算符,又称二元运算符;三目运算符,又称三元运算符。大部分运算符都是双目运算符,只有几个单目运算符和一个三目运算符,另外还包括几个其他运算符,下面分别介绍这些运算符。,4.2 单目运算符,常见的单目运算符有+(一元加)-(一元减)
2、!(逻辑非)(按位求补)+(一元递增)-(一元递减)type(强制类型转换运算符)一元加和一元减运算符对所有数值类型均适用;逻辑非运算符只对布尔类型适用;按位求补运算符适用于int、uint、long和ulong类型;递增和递减运算符适用于数值类型和枚举类型。注意,为了提高程序代码的可读性,单目运算符应该紧挨着它们的操作数,不能添加任何干扰性的空字符。,一元加和一元减运算符,一元加和一元减运算符用于改变一个数值变量的正负号。注意,一元加运算符不会对操作对象进行任何改变。示例:decimal balance=100;Console.WriteLine(输出初始balance的值:0,balanc
3、e);balance=-balance;Console.WriteLine(输出改变后的值balance的值:0,balance);balance=+balance;Console.WriteLine(输出改变后的值balance的值:0,balance);Console.Read();执行上述代码,结果为100,-100,-100。,一元加和一元减运算符,上述代码中,需要特别说明的是WriteLine()函数,该函数最常用的使用方法如下。Console.WriteLine(HelloWorld!)或Console.WriteLine(x),直接输出括号内字符串常量或某变量的值。Console
4、.WriteLine(x=0,x),输出字符串,且该字符串中包含某变量。其中,x为占位符,输出时它会被变量x的值代替。,逻辑非运算符,逻辑非运算符(!)主要用于对操作对象进行取反操作,操作对象只能是bool类型的变量。示例及运行结果:bool a=false;Console.WriteLine(输出!a的值为0,!a);,按位求补运算符,按位求补运算符()用于对操作数执行按位求补运算,其效果相当于对每一位执行反转,按位求补运算符是为int、uint、long和ulong类型预定义的。示例及运行结果:static void Main(string args)int a=2;int b=a;Con
5、sole.WriteLine(Convert.ToString(a,2);Console.WriteLine(Convert.ToString(b,2);Console.Read();,一元递增运算符和一元递减运算符,一元递增运算符(+),它可以用表达式a+或+a实现变量a的值增1,而不必使用表达式a=a+1和a+=1。注意:此类运算符放在变量的前面称为前置运算符,如+a;放在变量后面称为后置运算符,如a+。前置运算符与后置运算符有所区别,前置运算符先改变变量的值,然后再改变表达式的值;而后置运算符先改变表达式的值,然后再改变变量的值,例如:j=i+;/相当于j=i;i=i+1;j=+i;/相
6、当于i=i+1;j=i;,一元递增运算符和一元递减运算符,注意,如果试图对表达式而不是变量参数使用递增或者递减运算符,将会导致语法错误。其中变量参数是指能够出现在赋值运算符左边的变量或表达式。例如,+(x+1)就是一个语法错误,因为x+1不是变量参数。,强制类型转换运算符,强制类型转换运算符(type)在第3章有过介绍,作用是显式转换变量类型。示例:int a,b;double j;a=2;j=a;Console.WriteLine(输出j的值为0,j);b=j;/编译错误。需要使用强制类型转换符,应修改为b=(int)j。,4.3 双目运算符,常见的双目运算符包括:算术运算符位运算符关系运算
7、符类型测试运算符逻辑运算符条件逻辑运算符条件运算符赋值运算符其他运算符,4.3.1 算术运算符与算术表达式,算术运算符有+(加)、-(减)、*(乘)、/(除)和%(取余),与数学运算符的用法类似,它们的优先级关系与数学运算也是一致的,即先乘除,后加减,同级运算之间按从左至右的顺序进行运算。C#.NET中的“+”运算符有两种用法,一种用于计算两个操作数或表达式的和,另一种可作为连接字符串的连接符 例如:1000+“+”+1100,结果生成一个新的字符串“1000+1100”。,使用算术运算符,static void Main(string args)int a=8;int b=2;string
8、myname=nihao!;int c=3;double f=1.2;Console.WriteLine(输出a+b的值为0,a+b);Console.WriteLine(输出a-b的值为0,a-b);Console.WriteLine(输出a+myname的值为0,a+myname);Console.WriteLine(输出a*b的值为0,a*b);Console.WriteLine(输出a/b的值为0,a/b);Console.WriteLine(输出a/c的值为0,a/c);Console.WriteLine(输出a/f的值为0,a/f);Console.WriteLine(输出a%c的
9、值为0,a%c);Console.Read();注意:a/f,由于操作数不是同一个级别上的,系统为了不丢失精度,先将低精度操作数隐式转换为高精度操作数。这里将整型a隐式转换为双精度double型,然后再运算,因此运算结果为6.666666666666667,是双精度型,而非整型。,取余运算符的详细用法,注意:C#中取余运算操作数的类型为数值类型,例如浮点型和字符型,而其他语言中取余运算符的操作数只能为整数。示例及运行结果:static void Main(string args)int a=8,j=3,b=-3,c=-8;double d=8.1;Console.WriteLine(输出a%j
10、的值为0,a%j);Console.WriteLine(输出a%b的值为0,a%b);Console.WriteLine(输出c%j的值为0,c%j);Console.WriteLine(输出d%j的值为0,d%j);Console.Read();,4.3.2 位运算符与位表达式,位运算符用于对操作数的位进行运算,常用二元位运算符如右表。,按位与,此运算符的作用是将两个操作数对应的每一个位分别进行逻辑与操作,具体规则为:与1相与,结果不变;与0相与,结果为0。例如,计算3&5,运算过程如下。3:0 0 0 0 0 0 1 15:(&)0 0 0 0 0 1 0 13&5:0 0 0 0 0 0
11、 0 1运算结果为1。使用按位与操作可以将操作数的若干位置0,其他位不变。,按位或,此运算符的作用是将两个操作数对应的每一位分别进行逻辑或操作,具体规则为:与1相或,结果为1;与0相或,结果不变。例如,计算3|5,运算过程如下。3:0 0 0 0 0 0 1 15:(|)0 0 0 0 0 1 0 13|5:0 0 0 0 0 1 1 1运算结果为7。使用按位或操作可以将操作数中的若干位置1,其他位不变。,按位异或,此运算符的作用是将两个操作数对应的每一位进行异或,具体规则为:若对应位相同,则该位的运算结果为0;若对应位不同,则该位的运算结果为1。例如,计算35,运算过程如下。3:0 0 0
12、0 0 0 1 15:()0 0 0 0 0 1 0 135:0 0 0 0 0 1 1 0使用按位异或操作可以将操作数中的若干指定位的值翻转。如果使某位与0异或,结果是该位的原值;如果使某位与1异或,则结果与该位原来的值相反。,移位运算符,移位运算符有(右移运算符)两个。左移是按照指定的位数将一个数的二进制值向左移位。左移后,低位补0,移出的高位舍弃。右移是按照指定的位数将一个数的二进制值向右移位。右移后,移出的低位舍弃。注意:若右移运算符的操作数是int或long型,最高位为符号位;若该操作数是非负数,则最高位设为0;若操作数为负数,则最高位设为1。若右移运算符的操作数为uint 或者ul
13、ong型,没有符号位,则操作数各位依次右移,高位设为0。,移位运算符,移位运算符示例:static void Main(string args)int a=2,b=-8;int c,d;Console.WriteLine(输出a的值为0,a);c=a 2;Console.WriteLine(输出a左移两位后的值为0,c);Console.WriteLine(输出a右移两位后的值为0,d);Console.WriteLine(输出b右移两位后的值为0,b 2);Console.WriteLine(输出a的值为0,a);Console.Read();,4.3.3 关系运算符与关系表达式,在解决许多
14、问题时都需要进行情况判断,对复杂的条件进行逻辑分析。#中也提供了用于比较、判断的关系运算符和用于逻辑分析的逻辑运算符。关系运算符是比较简单的一种逻辑运算。通过关系运算符将两个操作数连接起来,即为关系表达式。关系表达式的结果为bool类型,值只能为true或false。关系运算符包括=、!=、=。其中,、=运算符适用于整数类型、浮点类型和decimal类型;=和!=运算符适用于整数类型、浮点类型、decimal类型、布尔类型、枚举类型、引用类型、字符串类型和委托类型。,常用关系运算符,使用关系运算符,class Program enum Range:long max=214L,min=123L;
15、static void Main(string args)bool x=false,y=true;Console.WriteLine(0,x=y);Range a=Range.max,b=Range.min;Console.WriteLine(0,a=b);string m=testequal;string n=m;Console.WriteLine(0,m=n);Console.Read();,4.3.4 类型测试运算符与类型测试表达式,类型测试运算符主要用于更安全地进行强制类型转换,包括is运算符和as运算符。is运算符用于查看未知变量是否为给定类型的变量,或者是否为给定类型派生出来的类型
16、的变量。如果是,则返回true。is运算符的语法形式如下:is,4.3.4类型测试运算符与类型测试表达式,is运算符示例及运行结果:static void Main(string args)string a=yes;int b=0;if(a is string)Console.WriteLine(It is a string);else Console.WriteLine(It is not a string);if(b is string)Console.WriteLine(It is a string);else Console.WriteLine(It is not a string);
17、Console.Read();,4.3.4类型测试运算符与类型测试表达式,as运算符用于将一个值显式地转换(使用引用转换或装箱转换)为一个给定的引用类型。如果要转换的类型与指定的类型兼容,转换就会成功执行;如果类型不兼容,as运算符就会返回null。这里的兼容是指对象是该类型或派生于该类型。注意as运算符必须与引用类型一起使用,int等值类型不能使用。as运算符的语法形式如下:as,4.3.4类型测试运算符与类型测试表达式,as运算符示例 及运行结果:static void Main(string args)object a1=nihao;object a2=12;string s1=a1 a
18、s string;string s2=a2 as string;Console.WriteLine(输出s1的值0,s1);Console.WriteLine(输出s2的值0,s2);Console.Read();,4.3.5 逻辑运算符与逻辑表达式,只有简单的关系比较是远不能满足实际编程需要的,还需要使用逻辑运算符将简单的关系表达式连接起来,构成比较复杂的逻辑表达式。为了在判断过程中测试多个条件,C#语言提供了一些逻辑运算符和条件逻辑运算符,可以利用它们组合成复杂的条件。注意,逻辑运算符的操作对象必须是bool类型,且逻辑运算符会计算所有的操作数。,常用逻辑运算符,4.3.5 逻辑运算符与逻
19、辑表达式,逻辑与运算符示例及运行结果:static void Main(string args)int gender=1,age=65;if(gender=1,4.3.5 逻辑运算符与逻辑表达式,逻辑或运算符示例及运行结果:static void Main(string args)int gender=1,age=65;if(gender=1|(+age=65)Console.WriteLine(输出age的值为0,age);if(gender!=1|(+age=65)Console.WriteLine(输出age的值为0,age);Console.WriteLine(输出age的值为0,ag
20、e);Console.Read();,4.3.6 条件逻辑运算符与条件逻辑表达式,条件与(&)和条件或(|)运算符称为条件逻辑运算符。包含条件逻辑运算符的表达式称为条件逻辑表达式。,4.3.6 条件逻辑运算符与条件逻辑达式,条件逻辑运算符,4.3.6 条件逻辑运算符与条件逻辑表达式,条件逻辑运算符|示例及运行结果:static void Main(string args)int gender=1,age=65;if(gender=1|(+age=65)Console.WriteLine(输出age的值为0,age);if(gender!=1|(+age=65)Console.WriteLine
21、(输出age的值为0,age);Console.WriteLine(输出age的值为0,age);Console.Read();,4.3.7 赋值运算符与赋值表达式,赋值运算符(=)用于为变量、属性、事件或索引器元素赋值。除了直接赋值以外,C#语言还提供了用于简化赋值表达式的快捷赋值运算符。例如,语句c=c+3可以简化为c+=3。,4.4 三目运算符,三目运算符就是包含3个操作数的运算符。条件运算符是唯一的三元运算符,它由“?”和“:”两个标点符号组成,它的3个对象均是表达式。语法形式如下:?:先计算条件condition,如果计算结果为true,则计算expression1的值,且整个表达式
22、的值是expression1的值;如果计算结果为false,则计算expression2的值,且整个表达式的值是expression2的值。注意,条件计算的结果必须为bool型,否则会出错。,4.4 三目运算符,三目运算符示例及运行结果:int a=1;string s=a.ToString()+;s+=(a=1?man:men);Console.WriteLine(s);Console.Read();,4.5 其他运算符,checked运算符与unchecked运算符在进行整数算术运算(如+、-、/等)或从一种整型显式转换到另一种整型时,有可能发生溢出。checked运算符用于进行溢出检查,
23、有溢出时会引发异常。而被unchecked运算符包括的代码即使有溢出,也不会引发异常,只是返回值被截掉不符合目标类型的高位。,4.5 其他运算符,Visual Studio 2008编译器默认设置为不检查运算溢出,因此程序中即使有溢出,也不会引发异常,返回值也只是被截掉不符合目标类型的高位。如果需要开启检查运算溢出,则需要在Visual Studio 2008开发环境中设置此编译器选项,设置步骤如下。(1)打开项目的【属性】窗口。(2)单击左侧的【生成】选项。(3)单击【高级】按钮。(4)勾选【检查算法上溢/下溢】复选框,使用checked运算符,将强制编译器检查被checked标记包括的代码
24、块中是否有运算溢出。使用unchecked关运算符,强制编译器不检查这几行代码是否有运算溢出。,4.5 其他运算符,check运算符示例及运行结果:byte b=255;checked b+;Console.WriteLine(b.ToString();,4.5 其他运算符,sizeof 运算符 sizeof 运算符用于确定值类型的长度,单位为字节。注意,sizeof运算符仅适用于值类型,而不适用于引用类型。示例:Console.WriteLine(sizeof(int);运行结果显示数字4,因为int有4个字节,4.5 其他运算符,typeof 运算符typeof运算符用于返回一个表示特定类
25、型的System.Type对象,例如typeof(int)返回System.Int32对象。示例及运行结果:static void Main(string args)int a=8;string z;z=加油哦!;string c=a+z;Console.WriteLine(输出a的类型0,typeof(int);Console.WriteLine(输出c的类型0,c.GetType();Console.Read();,4.5 其他运算符,new运算符new运算符用于创建新的类型实例,可以创建类类型、值类型、数组类型和委托类型。示例:Class zhanghua=new Person();in
26、t myint=new int();string array=new string4;,4.6 标点符号,标点符号是某些运算符的重要组成部分,能够为代码编写带来很多的方便。例如,三目运算符,就是由两个标点符号“?”和“:”组成的运算符。常见的标点符号点符号(.),点符号(.)在访问类成员、访问枚举成员以及在正则表达式中都会用到。,使用点符号,class Program class Student string sno;string sname;public Student(string no,string name)sno=no;sname=name;public void display()
27、Console.WriteLine(学生的学号是0,sno);Console.WriteLine(学生的姓名是0,sname);static void Main(string args)Student a1=new Student(01,xiaoming);a1.display();Console.Read();,4.7 运算符优先级,当表达式中包含多个运算符时,哪个运算符先参加运算是由运算符的优先级来决定的,高优先级的运算符会先参加运算。,当表达式中出现两个具有相同优先级的运算符时,将根据结合性计算它们表示从左向右,表示从右向左,4.7 运算符优先级,运算符优先级示例及运行结果:static
28、 void Main(string args)int a=1,b=2,c=3;bool f=true;bool m;m=a+b+c2=1,4.7 运算符优先级,运算符结合性示例及运行结果:static void Main(string args)int a;int b=2;Console.WriteLine(0,a=b*=3);Console.WriteLine(输出b的值为0,b);Console.Read();,4.8 正则表达式,正则表达式就是用某种规则去匹配指定字符串的一种表示方式,它由普通字符和元字符组成。普通字符指我们平常使用的字符,如字母、数字、汉字等;元字符指可以匹配某些字符形
29、式的具有特殊含义的字符,其作用类似于DOS命令使用的通配符。,基本书写符号,限定符,限定符(续),匹配字符集,正则表达式书写举例,至少一个字符:.0,。3个“.”句点符号:.3。括号括起来的23个数字构成的字符串:(0-92,3),其中反斜杠()表示转义。国内电话号码:(d3-|d4-)?(d8|d7),其中一种是三位区号,8位本地号(如010-12345678),另一种是4位区号,7位本地号(如0376-1234567),且区号可有可无。至少3个汉字:u4e00-u9fa53,,其中u4e00-u9fa5是UTF8编码中汉字的范围。必须包含“cd”的字符串:.0,cd.0,。,4.9 小结,通过本章的学习,对基本的运算符与表达式有了一定的认识,对于后续的编程学习将非常有用。,