21天学通C#
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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。