第5章 表达式和运���符
计算机的核心功能就是运算。为了让计算机完成对应的工作,编程语言将常见的运算都预先设定好,并使用相应的符号表示。这些符号就是运算符。将这些符号和我们要处理的数据结合起来,就构成了表达式。本章将详细讲解C#中的各种运算符和表达式。
5.1 运算的*小单位——表达式
表达式是一个由操作数(operand)和运算符(operator)构成的序列。运算符指定操作数的运算规则,即指示对表达式中的操作数进行什么样的运算。本节将详细介绍表达式。
5.1.1 表达式分类
在C#语言中,根据操作数的类型可以把表达式分为以下9种类别,如表5.1所示。
表5.1 C#中的操作数表
操作数类型
运 算
值
每一个值都有关联的类型
变量
每一个变量都有关联的类型。如果该变量定义了相关的类型,则称该变量为已声明类型的变量
命名空间
C#程序是利用命名空间组织起来的
类型
指定变量数据的存储方式和操作方法
方法组
表示一组方法,并可以通过实例调用方法组中的方法
属性访问
每个属性访问都有关联的类型,即该属性的类型
事件访问
每个事件访问都有关联的类型,即该事件的类型
索引器访问
每个索引器访问都有关联的类型,即该索引器的元素类型
Nothing
出现在调用一个具有void返回类型的方法时
下面介绍两个特殊的表达式:this和new。它们隐藏了操作符,都有其特殊的作用。使用this关键字可以限定名称相同的成员,new关键字作为new运算符时可以创建对象等。
5.1.2 this关键字
this关键字可以用来引用类的当前实例。this关键字存在3种常用用法:限定名称相同的成员、将对象本身作为参数和声明索引器。下面介绍this的**种用法,后面两种用法会在相应章节介绍。
限定名称相同的成员是指在某一个类中,如果某一个成员的名称和其他对象(如参数等)的名称相同,那么可以通过this关键字限定该成员。
【示例5-1】下面创建一个名称为Program的类,并声明了一个名称为i的私有成员。
01 using System;
02 namespace 示例5_1
03 {
04 class Program
05 {
06 private int
i;
07 public
Program(int i)
08 {
09
this.i =
i;
//将i参数的值赋值给Program类的私有成员i
10 }
11 static void
Main(string[] args)
12 {
13
Program p = new Program(123);
14
Console.WriteLine("i="+p.i);
15
Console.ReadLine();
16 }
17 }
18 }
?注意:在Program(int
i)函数中,Program类的i成员的名称和i参数的名称相同,为了区分这两个对象,则需要使用this关键字来限定Program类的i成员。因此,this.i表示Program类的i成员。
分析:在“this.i =
i;”语句中,this.i表示Program类的私有成员i,i(“=”的右边表达式)表示i参数。因此,“this.i =
i;”语句将i参数的值赋值给Program类的私有成员i。运行结果如图5.1所示。
图5.1 this示例
5.1.3 new关键字
new关键字有3种用法,分别是作为new运算符、new修饰符和new约束。本节只介绍new作为运算符的用法,其他两种用法在相应章节继续学习。当new关键字作为new运算符时,它可以用来创建对象和调用构造函数、创建匿名类型的实例、调用值类型的默认构造函数等。
【示例5-2】下面使用new运算符创建一个类型为object的对象o。
object obj = new
object();
//new运算符创建object类的对象obj
?注意:当new运算符创建类型的一个新实例时,但并非为该实例动态分配内存。对于值类型的实例而言,一般不需要分配该实例表示的变量之外的内存(值类型的实例本身会占用一定的内存)。因此,在使用new运算符创建值类型的实例时,是不会发生动态分配内存。
5.2 运算的核心——运算符
运算符是表达式很重要的一部分,它指示对表达式中的操作数进行什么样的运算,如+、–、*、/、%等。根据运算符所需操作数的个数,可以把运算符分为一元运算符、二元运算符和三元运算符。本节将介绍有关运算符的知识。
5.2.1 算术运算符
算术运算是基本的数学运算。它包括加、减、乘、除。在C#中,分别使用+、–、*、/表示。同时,C#还使用%表示不常用的求余运算。它们的基本语法格式如下:
left expression operator right expression
left expression和right
expression分别表示左操作数和右操作数,operator表示运算符,可以为*、/、%、+和–。
【示例5-3】下面使用+运算符计算i和j两个操作数(均为int类型)的和,结果保存为result变量。运行结果如图5.2所示。
01 using System;
02 namespace 示例5_3
03 {
04 class Program
05 {
06 static void
Main(string[] args)
07 {
08
int i=10, j=10;
09
int result = i + j;
//使用+运算符计算变量i和j的和
10
Console.WriteLine("result="+result );
11
Console.ReadLine();
12 }
13 }
14 }
图5.2 +运算符示例
如果左、右操作数的类型相同,则它们的运算结果的类型和操作数的类型相同。当运算结果超出了该类型表示的范围时,如果使用了checked运算符,则引发System.OverflowException异常。如果使用了unchecked运算符,则不引发异常,但是其结果类型范围外的任何有效高序位都被放弃。
对于+运算符而言,如果其一个或两个操作数为string类型时,则+运算符执行字符串串联操作,而不是简单的算术运算。
【示例5-4】下面使用+运算符s1和s2(均为string类型)字符串串联起来,并保存为s3变量。
01 using System;
02 namespace 示例5_4
03 {
04 class Program
05 {
06 static void
Main(string[] args)
07 {
08
string s1 = "abc";
09
string s2 = "def";
10
string s3 = s1 +
s2;
//使用+运算符将两个字符串串起来
11
Console.WriteLine("s3="+s3);
12
Console.ReadLine();
13 }
14 }
15 }
分析:s3变量的值为abcdef字符串。运行结果如图5.3所示。
图5.3 +运算符执行字符串串联操作示例
5.2.2 自增、自减运算符
自增、自减运算符都属于一元运算符,执行对操作数进行加1或者减1的操作。本节将详细介绍自增、自减运算符的使用方法。
1.++运算符
++运算符又称为增量运算符,其作用是对操作数进行加1。将++运算符放在操作数的左边,称该运算符为前缀增量运算符。否则,称为后缀增量运算符。语法如下:
++ expression
或者
expression ++
expression表示操作数。“++
expression”表达式首先计算expression的值,然后将其值增1,并作为该表达式的结果。“expression
++”表达式首先计算expression的值,并作为该表达式的结果,然后将expression的值增1。
【示例5-5】下面使用++运算符分别计算i变量的前缀增量和后缀增量的值,结果分别保存为j和k变量。
01 using System;
02 namespace 示例5_5
03 {
04 class Program
05 {
06 static void
Main(string[] args)
07 {
08
int i = 10;
09
int j =
++i;
//i先进行自加运算,将结果保存在变量j中
10
int k =
i++;
//i先将值赋给变量k,再进行自加运算
11
Console.WriteLine("i="+i+",j="+j+",k="+k);
12
Console.ReadLine();
13 }
14 }
15 }
分析:“++i”表达式执行之后,i变量的值为11,并作为该表达式的值。因此,j变量的值为11。“k =
i++”表达式首先获取i变量的值,并赋值给k变量,这时,k变量的值为11,然后再将i变量的值增1,因此i变量的值为12。*终,i、j和k变量的值分别为12、11和11。运行结果如图5.4所示。
图5.4 使用++运算符示例
2.– –运算符
– –运算符又称为减量运算符,其作用是对操作数进行减1。将–
–运算符放在操作数的左边,称该运算符为前缀减量运算符。否则,称为后缀减量运算符。语法如下:
-- expression
或者
expression--
expression表示操作数。“– –
expression”表达式首先计算expression的值,然后将其值减1,并作为该表达式的结果。“expression –
–”表达式首先计算expression的值,并作为该表达式的结果,然后将expression的值减1。
【示例5-6】下面使用– –运算符分别计算i变量的前缀减量和后缀减量的值,结果分别保存为j和k变量。