《零点起飞学c#之表达式和运算符》由会员分享,可在线阅读,更多相关《零点起飞学c#之表达式和运算符(41页珍藏版)》请在金锄头文库上搜索。
1、第5章 表达式和运算符计算机的核心功能就是运算。为了让计算机完成对应的工作,编程语言将常见的运算都预先设定好,并使用各种符号表示。这些符号就是运算符。将这些符号和我们要处理的数据结合起来,就构成了表达式。本章将详细讲解C#中的各种运算符和表达式。5.1 运算的最小单位表达式表达式是一个由操作数(operand)和运算符(operator)构成的序列。运算符指定操作数的运算规则,即指示对表达式中的操作数进行什么样的运算。本节将详细介绍表达式。5.1.1 表达式分类在C#语言中,根据操作数的类型可以把表达式分为以下9种类别,如下表所示。操作数类型运 算值每一个值都有关联的类型变量每一个变量都有关联
2、的类型。如果该变 量定义了相关的类型,则称该变 量为已声明类型的变量命名空间C#程序是利用命名空间组织 起来的类型指定变量数据的存储方式和操作方法方法组表示一组方法,并可以通过实 例调用方法组中的方法属性访问每个属性访问 都有关联的类型,即该属性的类型事件访问每个事件访问 都有关联的类型,即该事件的类型索引器访问每个索引器访问 都有关联的类型,即该索引器的元素类型Nothing出现在调用一个具有void返回类型的方法时下面我们来学习几个特殊的表达式,如this、new。它们隐藏了操作符,都有其特殊的作用。使用this关键字可以限定名称相同的成员,base关键字用于从派生类中访问基类的成员,ne
3、w关键字作为new运算符时可以创建对象等。5.1.2 this关键字this关键字可以用来引用类的当前实例。this关键字存在3种常用用法:限定名称相同的成员、将对象本身作为参数和声明索引器。下面我们来学习this的第一种用法,后面两种用法会在相应章节中学习。限定名称相同的成员是指在某一个类中,如果某一个成员的名称和其他对象(如参数等)的名称相同,那么可以通过this关键字限定该成员。【示例5-1】下面创建一个名称为Program的类,并声明了一个名称为i的私有成员。注意:在Program(int i)函数中,Program类的i成员的名称和i参数的名称相同,为了区分这两个对象,则需要使用th
4、is关键字来限定Program类的i成员。因此,this.i表示Program类的i成员。分析:在“this.i = i;”语句中,this.i表示Program类的私有成员i,i(“=”的右边表达式)表示i参数。因此,“this.i = i;”语句将i参数的值赋值给Program类的私有成员i。5.1.3 new关键字new关键字有3种用法,分别是作为new运算符、new修饰符和new约束。本节只讲解最基本的知识,学习new作为运算符的用法,其他两种用法在相应章节继续学习。当new关键字作为new运算符时,它可以用来创建对象和调用构造函数、创建匿名类型的实例、调用值类型的默认构造函数等。【示
5、例5-2】下面使用new运算符创建一个类型为object的对象obj。object obj = new object(); /new运算符创建object类的对象obj注意:当new运算符创建类型的一个新实例时,但并非为该实例动态分配内存。对于值类型的实例而言,一般不需要分配该实例表示的变量之外的内存(值类型的实例本身会占用一定的内存)。因此,在使用new运算符创建值类型的实例时,是不会发生动态分配内存。5.2 运算的核心运算符运算符是表达式很重要的一部分,它指示对表达式中的操作数进行什么样的运算,如+、*、/、%等。根据运算符所需操作数的个数,可以把运算符分为一元运算符、二元运算符和三元运算
6、符。本节我们来学习有关运算符的知识。5.2.1 算术运算符算术运算是基本的数学运算。它包括加、减、乘、除。在C#中,分别使用+、 、*、/表示。同时, C#还使用%表示不常用的求余运算。它们的基本语法格式如下:left expression operator right expressionleft expression和right expression分别表示左操作数和右操作数,operator表示运算符,可以为*、/、%、+和。【示例5-3】下面使用+运算符计算i和j两个操作数(均为int类型)的和,结果保存为result变量。如果左、右操作数的类型相同,则它们的运算结果的类型和操作数的类
7、型相同。当运算结果超出了该类型表示的范围时,如果使用了checked运算符,则引发System.OverflowException异常。如果使用了unchecked运算符,则不引发异常,但是其结果类型范围外的任何有效高序位都被放弃。对于+运算符而言,如果其一个或两个操作数为string类型时,则+运算符执行字符串串联操作,而不是简单的算术运算。【示例5-4】下面使用+运算符将s1和s2(均为string类型)字符串串联起来,并保存为s3变量。分析:s3变量的值为abcdef字符串。5.2.2 自增、自减运算符自增、自减运算符都属于一元运算符,执行对操作数进行加1或者减1的操作。本小节我们来详细
8、介绍自增、自减运算符的使用方法。1+运算符+运算符又称为增量运算符,其作用是对操作数进行加1。将+运算符放在操作数的左边,称该运算符为前缀增量运算符。否则,称为后缀增量运算符。语法如下:+ expression或者expression +expression表示操作数。“+ expression”表达式首先计算expression的值,然后将其值增1,并作为该表达式的结果。“expression +”表达式首先计算expression的值,并作为该表达式的结果,然后将expression的值增1。【示例5-5】下面使用+运算符分别计算i变量的前缀增量和后缀增量的值,结果分别保存为j和k变量。分
9、析:“+i”表达式执行之后,i变量的值为11,并作为该表达式的值。因此,j变量的值为等于11。“k = i+”表达式首先获取i变量的值,并赋值给k变量,因此,k变量的值为11。然后,再将i变量的值增1。因此,i变量的值为12。最终,i、j和k变量的值分别为12、11和11。2 运算符 运算符又称为减量运算符,其作用是对操作数进行减1。将 运算符放在操作数的左边,称该运算符为前缀减量运算符。否则,称为后缀减量运算符。语法如下:- expression或者expression-expression表示操作数。“ expression”表达式首先计算expression的值,然后将其值减1,并作为该
10、表达式的结果。“expression ”表达式首先计算expression的值,并作为该表达式的结果,然后将expression的值减1。【示例5-6】下面使用 运算符分别计算i变量的前缀减量和后缀减量的值,结果分别保存为j和k变量。分析:“ i”表达式执行之后,i变量的值为9,并作为该表达式的值。因此,j变量的值为等于9。“k = i ”表达式首先获取i变量的值,并赋值给k变量,因此,k变量的值为9。然后,再将i变量的值减1。因此,i变量的值为8。最终,i、j和k变量的值分别为8、9和9。5.2.3 逻辑运算符该表达式首先计算条件表达式的值。如果条件表达式的值为真,则resulta的值,并成
11、为运算结果。否则计算resultb,并成为运算结果。【示例5-10】下面使用?:运算符计算“i + j 300 ? i : j”表达式的值。其中,i和j均为int类型,值分别为10和20。分析:如果i + j表达式的值大于300时,则k的值等于i的值,否则k的值等于j的值。如果有一个包含?:运算符的表达式“j ? x : y”,则该表达式的计算步骤如下:(1)计算j的值。(2)若j的类型不为bool类型,则将j的值转换为bool类型。如果转换失败,则发生编译错误。(3)如果j的值为true,则计算x的值,并将结果作为该表达式的结果。(4)如果j的值为false,则计算y的值,并将结果作为该表达
12、式的结果。在使用?:运算符时,需要注意以下几点。?:运算符的第一个操作数(条件表达式)必须是能够隐式转换为bool类型或实现了operator true的表达式。否则发生编译错误。?:运算符的第2和3个操作数决定?:运算符表达式的结果的类型。第2和3个操作数的类型要么相同,要么能够从一个操作数的类型隐式转换为另外一个操作数的类型。否则发生编译时错误。5.2.5 条件逻辑运算符/.省略了给obj赋值的代码if(obj = null | obj.ToString().Length 运算符被称为移位运算符。运算符表示右移位。语法如下:expression operator count;express
13、ion表示被移位的表达式,count表示移动的位数,operator表示运算符,可以为。【示例5-13】下面使用运算符分别将i(为int类型,值为20)左移和右移2位,结果分别保存为c1和c2变量。分析:c1变量的值为80,c2变量的值为5。x count表达式将x向右移位count个位。计算方法如下:当x为int或long类型时,放弃x的低序位,将剩余的位向右位移。如果x非负,则将高序空位位置设置为零。如果x为负,则将其设置为1。当x为uint或ulong类型时,放弃x的低序位,将剩余的位向右位移,并将高序空位位置设置为零。5.2.7 关系运算符=、!=、=运算符称为关系。语法如下:left
14、 expression operator right expressionleft expression和right expression分别表示左操作数和右操作数,operator表示运算符,可以为=、!=、=。其中,=、!=、=运算符为比较运算符,它们的具体计算方法如下:x = y,如果x等于y,则为true,否则为false。x != y,如果x不等于y,则为true,否则为false。x y,如果x大于y,则为true,否则为false。x = y,如果x大于等于y,则为true,否则为false。【示例5-14】下面使用=运算符比较i和j的值(均为int类型,值分别为10和20)是否
15、相等,结果保存为k变量。分析:k变量的值为false。注意:=、!=、=运算符的结果均为bool类型。5.2.8 赋值运算符=、*=、/=、%=、+=、-=、=、int i = ( int )obj; /将变量obj从object型转换为int型注意:对于( T )x表达式而言,如果不存在从x的类型到T的显式转换,则发生编译错误。否则,结果为显式转换产生的值。类型测试运算符包括is和as运算符。is运算符用于动态检查对象的运行时类型是否与给定类型兼容,其结果也为bool类型。对于“e is T”表达式而言(其中,e为表达式,T为类型),如果e的结果能够隐式转换为T类型,则该表达式的结果为tru
16、e,否则为false。【示例5-17】下面使用is运算符检查i变量(类型为int)能否转换为object类型,结果保存为j变量。分析:j变量的值为true。C#中的每种类型都是直接或间接从object类类型派生的。因此,C#中的任何类型都可以转换为object类型。as运算符用于将一个值显式地转换为一个给定的引用类型。如果转换失败,则返回null。【示例5-18】下面使用as运算符将i变量(类型为int)转换为object类型的变量,并保存为j变量。注意:as运算符从不引发异常。对于“e as T”表达式而言,e必须是表达式,T必须是引用类型,且运算结果总是能够归属于T类型。5.3 小 结本章主要介绍了C#语言中的表达式和运算