2.3 运算符的应用
运算符就是执行某项操作的一个标识符,例如执行相加用“+”。C#提供了大量运算符,这些运算符是指定在表达式中执行哪些操作的符号。通常允许对枚举进行整型运算,例如==、!=、<、>、<=、>=、binary+、binary-、^、&、|、~、++、--和sizeof()。此外,很多运算符可被用户重载,由此在应用到用户定义的类型时更改这些运算符的含义。如表2.3列出了按优先级的顺序进行分组的C#运算符。每个组中的运算符具有相同的优先级。
表2.3 C#运算符
2.3.1 算术运算符
在C#中,算术运算符就是一些具有运算功能的符号。和数学中运用的一样,C#语言算术运算符包括+(加)、-(减)、*(乘)、/(除)、%(取余)。算术运算符用在数学表达式中,其用法和功能与数学中一样。
C#为数值和字符类型定义了二元运算符“+”,它可用于计算两个数值类型操作数的和,也可用于字符串的串联。下面来演示如何使用“+”运算符。
注意:二元运算符“+”用于数据值的和的计算,也可以用于字符串的串联,当用于字符串串联时,操作数必须为字符型。
【范例2-6】二元运算符“+”的使用,这里有两种功能,即作为数值计算和字符串联,如示例代码2-6所示。
示例代码2-6
01 using System; //包含基本类和基类 02 …… //还有其他命名空间,也是系统生成的,在此省略 03 namespace Ex_2_6 //程序的命名空间,也是项目名称,如Ex_2_6 04 { 05 class Program 06 { 07 static void Main(string[] args) //主函数,也是入口函数 08 { 09 Console.WriteLine(10 + 10); //这里的“+”号作为计算数值用 10 Console.WriteLine("10" + "10"); //这里的“+”号作为字符串相加用 11 Console.ReadLine(); //获取输入,为了控制台窗口停下来,看输
//出结果 12 } 13 } 14 }
【运行结果】选择“调试”|“启动调试”选项运行程序,结果如图2.9所示。
图2.9 “+”运算符的使用
【代码解析】在本例中,演示了“+”运算符的两种常用功能。在第09行示例代码中,运算符“+”用于计算两个数值型操作数的和。而在第10行代码中,运算符“+”用于两个字符串的串联。
2.3.2 赋值运算符
赋值就是将某一数值赋给某个变量的过程,赋值运算符有=、+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=、??。其中,“??”是一种很特殊的运算符,它的功能是如果“??”运算符的左操作数非空,则返回左操作数,否则返回右操作数。就好比有一件事情要办,准备了两种方案,如果第一种方案不能运行,那就运行第二种方案。下面来演示如何使用“??”运算符。
注意:初学者容易把“=”当做等号,在C#中等号是用“= =”来表示的。
【范例2-7】在本例中,演示运算符“??”的使用。用它检查左操作数是否为空,如示例代码2-7所示。
示例代码2-7
01 using System; //包含基本类和基类 02 …… //还有其他命名空间,也是系统生成的,在此省略 03 namespace Ex_2_7 //程序的命名空间,也是项目名称,如Ex_2_7 04 { 05 class Program 06 { 07 static void Main(string[] args) //主函数,也是入口函数 08 { 09 string i = null; //声明一个空的字符型变量i 10 string j = "10" ?? i;//声明字符型变量j,用“??”检查它的左操作数是否为空 11 Console.WriteLine(j);//由于“??”的左操作数据非空,所以将字符10赋给了j 12 Console.ReadLine(); //获取输入焦点,为了查看运行结果 13 } 14 } 15 }
【运行结果】选择“调试”|“启动调试”选项运行程序,结果如图2.10所示。
图2.10 “??”运算符的使用
【代码解析】在第09行代码中,将空值赋给string型变量i。而第10行代码中,运算符“??”用于检查左边和右边的操作数是否为空。如果左边的操作数不为空,则返回左边的操作数,否则返回右边的操作数。
注意:“??”运算符不能用于int型的操作,所以不要因为在示例代码2-7第10行代码中看到“10”就认为那是一个整数型的。
2.3.3 其他常用运算符
其他特殊运算符还包括++(自增)、--(自减)、?:、new、typeof。其中,“++”、“--”和“new”用得很多。“++”常用在变量自动增加值的问题中。同样,“--”常用在变量自动减少值的问题中。而“new”常用来实例化。所谓实例化,就是将一个概念中的事物具体化。例如有人这个概念,用“new”就可以从人这个概念中实例化一个活生生的人出来。
三目运算符“?:”是根据布尔表达式的值返回两个值中的一个。如果条件为真,则返回第一个值,否则返回第二个值。如a/b=1?true:false;如果a/b=1为真,则返回true,否则返回false。三目运算符常用在根据某种结果二选一的程序中。如要在两个同学中选一个当班长,就得规定一个条件,谁的成绩好就选谁,就可以这样来表示:成绩好?甲:乙。如果甲的成绩好,则选甲,否则选乙。new运算符用于创建一个新的类型实例,它有三种形式。
· 对象创建表达式;
· 数组创建表达式;
· 代表创建表达式。
注意:new创建的类实例,不一定动态分配内存,即内存空间。分配空间的意义就是在计算机的内存中开辟一些空间用于存储变量。
typeof运算符用于获取原型对象的类型。原型顾名思义就是数据类型本来的类型,如int型的原型是int32,就可以看出int在C#中是指32位的整型。它包括值类型和索引类型,下面来演示它的用法。
【范例2-8】运算符“typeof”的使用。在本例中,将获取int型、int32型、string型的原型。如示例代码2-8所示。
示例代码2-8
01 using System; //包含基本类和基类 02 …… //还有其他命名空间,也是系统生成,在此省略 03 namespace Ex_2_8 //程序的命名空间,也是项目名称,如Ex_2_8 04 {
05 class Program 06 { 07 static void Main(string[] args) //主函数,也是入口函数 08 { 09 Console.WriteLine(typeof(int)); //获取int型的原型 10 Console.WriteLine(typeof(System.Int32)); //也可以看做int的原型 11 Console.WriteLine(typeof(string)); //获取string型的原型 12 Console.ReadLine(); //获取输入焦点,为了看运行结果 13 } 14 } 15 }
【运行结果】选择“调试”|“启动调试”选项运行程序,结果如图2.11所示。
图2.11 运算符“typeof”的使用
【代码解析】在本例中,从第09行~第11行,都是用typeof运算符来获取值类型的原型。这样的操作在实际开发里用得不算很多,只是有时用于测试一些数据类型的原型时才用到。从运行的结果可以看出,使用typeof运算符获取了系统原型对象的类型。
令广大初学者困惑的三目运算符还有“? :”。使用好这个三目运算符对程序的优化很有帮助,有时它可以简化程序的代码。它的功能是“判断条件”?“条件成立则执行这部分语句”:“条件不成立则执行这部分语句”。其过程如图2.12所示。
图2.12 “? :”运算符的执行过程
它和if语句有等价的关系,和其对应的if结构程序如下所示。
01 if(判断条件) //相当于“? :”语句的前面部分 02 { 03 return a; //如果条件为真,相当于“? :”中间部分 04 } 05 else{ 06 return b; //相当于“? :”后面部分 07 }
注意:要比较两个数的大小时,常规的做法是定义一个中间变量,然后将两数进行比较,最后进行交换。而用“? :”运算符,只需要一行代码就可实现了,例如(a>b)?max=a:max=b。