C#从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

第5章 运算符与表达式

本章视频教学录像:53分钟

通过第4章的学习,我们对C#变量与常量的内容有了简单的了解。C#语言中的表达式类似于数学运算中的表达式,用运算符把操作数连接起来的式子就是表达式。本章主要介绍运算符的使用,以及各类表达式的语法。

本章要点(已掌握的在方框中打钩)

□ 运算符

□ 表达式

5.1 运算符

本节视频教学录像:44分钟

运算符是表示各种不同运算的符号,在程序设计语言中运算是指对各种数据进行处理,比如表示加法运算就用“+”运算符。根据运算符所要求的操作数的个数,运算符分为“一元运算符”、“二元运算符”和“多元运算符”等。一元运算符的操作数只有一个,二元运算符就是需要两个操作数参与的运算符,三元运算符要求有3个操作数参与运算。运算符的类型有算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符等,它们分别对应相应的表达式。下表列举了C#所支持的运算符。

5.1.1 算术运算符

算术运算符用于对数值进行计算,其结果仍是一个数值。算术运算符有“+”、“-”、“*”、“/”、“%”、“++”和“--”。其中“+”、“-”运算符既可作为一元运算符,也可作为二元运算符。“*”、 “/”和“%”只能作为二元运算符。自加运算符“++”、自减运算符“--”属于一元运算符。下面将对这几种算术运算符进行详细讲解。

1.加法运算符

加法运算符(+)是通过两个操作数相加来执行加法运算。

【范例5-1】 加法运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator1”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-1.txt)。

    01  int opr1=13;     //声明操作数变量并赋值
    02  int opr2=8;      //声明操作数变量并赋值
    03  int x;;          //声明int变量
    04  x=opr1+opr2; //两个操作数相加
    05  Console.WriteLine("加法运算:");
    06 Console.WriteLine("{0}+{1}={2}",opr1,opr2,x);      //输出加法运算结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

2.减法运算符

减法运算符(-)是通过操作数相减来执行减法运算。

【范例5-2】 减法运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator2”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-2.txt)。

    01 double d1=118.8;                            //声明操作数变量并赋值
    02 double d2=10.5;                             //声明操作数变量并赋值
    03 double x;                                   //声明double变量
    04 x=d1-d2;                                   //两个操作数相减
    05 Console.WriteLine("减法运算:");
    06 Console.WriteLine("{0}-{1}={2}",d1,d2,x);  //输出减法运算结果
    07  Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

3.乘法运算符

乘法运算符(*)是通过两个操作数相乘来执行乘法运算并返回它们的乘积。

【范例5-3】 乘法运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator3”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-3.txt)。

    01 int opr3=25;                                 //声明操作数变量并赋值
    02 int opr4=8;                                  //声明操作数变量并赋值
    03 int x;                                       //声明int变量
    04 x=opr3*opr4;                                       //两个操作数相乘
    05 Console.WriteLine("乘法运算:");
    06 Console.WriteLine("{0}*{1}={2}",opr3,opr4,x);      //输出乘法运算结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

4.除法运算符

除法运算符(/)是用被除数除以除数执行除法运算取商。

【范例5-4】 除法运算的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator4”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-4.txt)。

    01 int opr5=64;                                        //声明操作数变量并赋值
    02 int opr6=8;                                         //声明操作数变量并赋值
    03 int x;                                              //声明int变量
    04 x=opr5/opr6;                                       //两个操作数相乘
    05 Console.WriteLine("除法运算:");
    06 Console.WriteLine("{0}/{1}={2}",opr5,opr6,x);      //输出除法运算结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

5.求余运算符

求余运算符(%)是用来执行除法运算操作,得到余数的值。

【范例5-5】 求余运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator5”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-5.txt)。

    01 int opr7=100;    //声明操作数变量并赋值
    02 int opr8=8;      //声明操作数变量并赋值
    03 int x;                  //声明int变量
    04 x=opr7 % opr8;        //两个操作数进行求余运算
    05 Console.WriteLine("求余运算:");
    06 Console.WriteLine("{0}%{1}={2}",opr7,opr8,x);     //输出求余运算结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

6.自增、自减运算符

自增运算符“++”可将操作数加1,自减运算符“--”可将操作数减1,自加、自减运算符在操作数之前和操作数之后的结果是不一样的。

【范例5-6】 自增、自减运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator6”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-6.txt)。

    01  Console.WriteLine("--自加和自减运算举例:");
    02 int num1=5,var1;       //定义变量num1和var1,num1的初值为5
    03 var1=++num1;          //num1加1后赋给var1
    04 Console.WriteLine("num1=5,var1=++num1,var1={0},num1={1}",var1,num1);   //输出结果
    05 num1=5;               //设置num1的值为5,便于对比运算结果
    06 var1=num1++;          //num1赋给var1后加1
    07 Console.WriteLine("num1=5,var1=num1++,var1={0},num1={1}",var1,num1);
    08 num1=5;               //设置num1的值为5,便于对比运算结果
    09 var1=--num1;          //num1减1后赋给var1
    10 Console.WriteLine("num1=5,var1=--num1,var1={0},num1={1}",var1,num1);
    11 num1=5;               //设置num1的值为5,便于对比运算结果
    12 var1=num1--;          //num1赋给var1后减1
    13 Console.WriteLine("num1=5,var1=num1--,var1={0},num1={1}",var1,num1);
    14 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

5.1.2 赋值运算符

赋值运算符对运算符右边的操作式求值,并用该值设置运算符左边的变量操作式。赋值运算符主要有简单赋值(=)及复合赋值(+=、-=、*=、/=、%=、&=、|=、>>=、<<=、^=)运算符。可以放在赋值运算符左边的对象类型是变量、属性、索引和事件。如果赋值运算符两边的操作数类型不一致,就需要首先进行类型转换,然后再赋值。二元运算符就是需要两个操作数参与的运算符,赋值运算符是二元运算符。

【范例5-7】 赋值运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator7”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-7.txt)。

    01  Console.WriteLine("赋值运算符的例子:");
    02 int n=5,var1=2;  //定义变量n和var1,n的初值为5
    03 var1+=n;        //相当于var1=var1+n
    04 Console.WriteLine("n=5;var1=2;var1+=n,var1={0}",var1);   //输出结果
    05 n=5;            //设置n的值为5,便于对比运算结果
    06 var1=2;
    07 var1/=n;        //相当于var1=var1/n
    08 Console.WriteLine("n=5;var1=2; var1/=n,var1={0}",var1);  //输出结果
    09 Console.ReadLine();

【运行结果】

运行结果如下图所示。

5.1.3 比较运算符

比较运算符又称关系运算符,我们可以把它理解为一种“判断”,判断的结果是“真”或者“假”,关系表达式的返回值总是布尔型。也就是说比较运算符主要用于比较两个操作数并得到一个布尔类型的值。关系运算符有>、<、>=、<=、!=、==运算符,它们都属于二元运算符。下面对这几种关系运算符进行详细讲解。

1.大于运算符

大于运算符(>)用于比较一个操作数是否大于另外一个操作数,如果大于,返回true,否则返回false。

【范例5-8】 大于运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator8”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-8.txt)。

    01 int u1=13;       //声明操作数变量并赋值
    02  int u2=8;       //声明操作数变量并赋值
    03  bool result;     //声明int变量
    04  result=u1>u2;
    05  Console.WriteLine("大于运算:u1>u2");
    06  Console.WriteLine(result); //输出比较结果
    07  Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

2.小于运算符

小于运算符(<)用于比较一个操作数是否小于另外一个操作数,如果小于,该运算符返回true,否则返回false。

【范例5-9】 小于运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator9”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-9.txt)。

    01 decimal a=2001.00m;                //声明操作数变量并赋值
    02 decimal b=2000.00m;                //声明操作数变量并赋值
    03 bool result;                      //声明bool型变量
    04 result=a<b;
    05 Console.WriteLine("小于运算:a<b");
    06 Console.WriteLine(result);        //输出比较结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

3.大于或等于运算符

大于或等于运算符(>=)用于比较一个操作数是否大于或等于另外一个操作数,如果大于或等于,该运算符返回true,否则返回false。

【范例5-10】 大于或等于运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator10”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-10.txt)。

    01  int m1=13;      //声明操作数变量并赋值
    02  int m2=8;       //声明操作数变量并赋值
    03 bool result;                       //声明bool变量
    04 result=m1>=m2;
    05 Console.WriteLine("大于或等于运算:m1>=m2");
    06 Console.WriteLine(result);        //输出比较结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

4.小于或等于运算符

小于或等于运算符(<=)用于比较一个操作数是否小于或等于另外一个操作数,如果小于或等于,该运算符返回true,否则返回false。

【范例5-11】 小于或等于运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator11”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-11.txt)。

    01 int m1=13;                         //声明操作数变量并赋值
    02 int m2=8;                          //声明操作数变量并赋值
    03 bool result;                       //声明bool变量
    04 result=m1<=m2;
    05 Console.WriteLine("小于或等于运算:m1<=m2");
    06 Console.WriteLine(result);        //输出比较结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

5.等于运算符

等于运算符(==)用于比较一个操作数是否等于另外一个操作数,如果等于,该运算符返回true,否则返回false。

【范例5-12】 等于运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator12”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-12.txt)。

    01  int s1=13;      //声明操作数变量并赋值
    02  int s2=8;                         //声明操作数变量并赋值
    03 bool result;                       //声明bool变量
    04 result=s1==s2;
    05 Console.WriteLine("等于运算:s1==s2");
    06 Console.WriteLine(result);        //输出比较结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

6.不等于运算符

不等于运算符(!=)是与等于运算符相反的运算符,用于比较一个操作数是否不等于另外一个操作数,如果不等于,该运算符返回true,否则返回false。它有两种表达式,一种是普通的不等运算符(!=),另一种是相等运算符的否定!(a==b)。这两种格式可以计算出相同的值。

【范例5-13】 不等于运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator13”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-13.txt)。

    01 int n1=13;                             //声明操作数变量并赋值
    02 int n2=8;                              //声明操作数变量并赋值
    03 bool result1;                          //声明bool变量
    04 bool result2;
    05 result1=n1!=n2;
    06 result2=!(n1==n2);
    07 Console.WriteLine("不等于运算:n1!=n2");
    08 Console.WriteLine(result1);              //输出比较结果
    09 Console.WriteLine(result2);              //输出比较结果
    10 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

5.1.4 逻辑运算符

逻辑运算符用于连接一个或多个条件,判断这些条件是否成立。C#中的逻辑运算符有“&”“、|”“、^”、“&&”、“||”、“!”,可分为两类,“&”、“|”、“^”称为整体逻辑运算符,它们允许在两个数值上进行布尔运算;“&&”、“||”、“!”称为条件逻辑运算符,运算符两边的操作数的值必须是布尔类型,操作数常为条件表达式。

这些运算符,除了条件运算符(“!”)以外,都是二元运算符,条件运算符是一元运算符。下面对这几种逻辑运算符进行详细讲解。

1.按位“与”运算符

按位“与”运算符(&)产生两个操作数按位与后的值。当两个操作数的对应位都是1时,返回的对应的结果位是1;当两个整数的对应位都是0或者其中一个位是0时,返回相应的结果位是0。

【范例5-14】 按位“与”运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator14”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-14.txt)。

    01 int u1=6,u2=8,u3;        //声明操作数变量并赋值
    02 u3=u1&u2;                //对变量u1、u2进行与运算
    03 Console.WriteLine("按位与运算:u1&u2");
    04 Console.WriteLine(u3);   //输出比较结果
    05 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

2.按位“或”运算符

按位“或”运算符(|)产生两个操作数按位或后的值。当两个操作数的对应位有一个是1时,返回的对应的结果位是1;当两个操作数的对应位都是0时,返回相应的结果位是0。

【范例5-15】 按位“或”运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator15”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-15.txt)。

    01 int u1=6,u2=8,u3;        //声明操作数变量并赋值
    02 u3=u1|u2;                //对变量u1、u2进行或运算
    03 Console.WriteLine("按位或运算:u1|u2");
    04 Console.WriteLine(u3);   //输出比较结果
    05  Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

3.按位“异或”运算符

按位“异或”运算符(^)产生两个操作数按位异或后的值。当两个操作数的对应位一个是1,另外一个是0时,返回的对应的结果位是1;当两个操作数的对应位都是1或者都是0时,返回相应的结果位是0。

【范例5-16】 按位“异或”运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator16”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-16.txt)。

    01 int u1=6,u2=8,u3;        //声明操作数变量并赋值
    02 u3=u1^u2;                //对变量u1、u2进行异或运算
    03 Console.WriteLine("按位异或运算:u1^u2");
    04 Console.WriteLine(u3);   //输出比较结果
    05 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

4.布尔“与”运算符

布尔“与”运算符(&&)用于比较两个布尔操作数。当两个布尔操作数的结果都为真时,结果为“真”,其余情况结果为“假”。

【范例5-17】 布尔“与”运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator17”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-17.txt)。

    01 int u1=6,u2=8;                   //声明整型变量并赋值
    02 String n1="Ada",n2="Alice";       //声明字符变量并赋值
    03 bool b1,b2,b3;                   //声明布尔变量
    04 b1=u1>u2;                        //比较u1、u2,结果放入b1
    05 b2=n1==n2;                       //比较n1、n2,结果放入b2
    06 b3=b1&&b2                        //比较b1、b2,结果放入b3
    07 Console.WriteLine("比较运算:u1>u2");
    08 Console.WriteLine(b1);           //输出比较结果
    09 Console.WriteLine("等于运算:n1==n2");
    10 Console.WriteLine(b2);
    11 Console.WriteLine("布尔与运算:b1&&b2");
    12 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

5.布尔“或”运算符

布尔“或”运算符(||)用于比较两个布尔操作数。只要一个布尔操作数的结果为真,则结果为“真”,如果两个布尔操作数的值都是假,则结果为假。

【范例5-18】 布尔“或”运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator18”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-18.txt)。

    01 int u1=6,u2=8;                   //声明整型变量并赋值
    02 String n1="Ada",n2="Alice";       //声明字符变量并赋值
    03 bool b1,b2,b3;                   //声明布尔变量
    04 b1=u1>u2                         //比较u1、u2,结果放入b1
    05 b2=n1==n2;                       //比较n1、n2,结果放入b2
    06 b3=b1||b2;                       //比较b1、b2,结果放入b3
    07 Console.WriteLine("比较运算:u1>u2");
    08 Console.WriteLine(b1);          //输出比较结果
    09 Console.WriteLine("等于运算:n1==n2");
    10 Console.WriteLine(b2);
    11 Console.WriteLine("布尔或运算:b1||b2");
    12 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

6.条件“非”运算符

条件“非”运算符(!)用于对布尔操作数结果取反。

【范例5-19】 条件“非”运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator19”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-19.txt)。

    01 String n1="Ada",n2="Alice";       //声明字符变量并赋值
    02 bool b1,b2;                      //声明布尔变量
    03 b1=n1==n2;                       //比较n1、n2,结果放入b1
    04 b2=!b1;                          //比较n1、n2,结果放入b2
    05 Console.WriteLine("等于运算:n1==n2");
    06 Console.WriteLine(b1);           //输出比较结果
    07 Console.WriteLine("条件非运算:b2=!b1");
    08 Console.WriteLine(b2);
    09 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

5.1.5 其他运算符

C#中还有一些运算符不能简单归结到某个类型,下面对这些特殊的运算符进行讲解。

1.条件运算符

条件运算符(?:)是if…else的简化格式,它是三元运算符。三元运算符要求有三个操作数参与运算。格式为:

操作数1?操作数2:操作数3;

其中操作数可以为变量或者表达式。输出结果为:如果操作数1为“真”,输出操作数2;如果操作数1为“假”,输出操作数3。三元运算符的输出结果取决于“?”前面的操作数1。

【范例5-20】 条件运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator20”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-20.txt)。

    01 int n;                  //定义变量n
    02 Console.WriteLine("条件运算符:");
    03 Console.WriteLine("n=3>8?3:8结果:n={0}",n=3>8?3:8);
    04 Console.WriteLine("n=3<8?3:8结果:n={0}",n=3<8?3:8);
    05 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

2. ()运算符

()运算符用于指定操作数中的运算顺序和指定强制转换或类型转换。()运算符的使用范围非常广泛。如下所示。

    01 int n;           //声明整型变量
    02 double m=(1.6+1)*3;
    03 n=(int)m;       //()用于类型转换

3. 点运算符

点运算符(.)用于访问数据结构的成员。前面列举的实例程序几乎都有应用。格式为:

    数据结构.成员

如下所示。

    01 System.Console.WriteLine("hello");
    02 System.Console.ReadLine();

4. 索引运算符

索引运算符([])用于数组、索引器和属性,也可用于指针。如数组类型是一种后跟[]的类型,如下所示,创建一个有10个元素的数组,若要访问数组的一个元素,则用方括号括起所需元素的索引。

    01 int[]a=new int[10];
    02 a[0]=a[1]=1;

5. new运算符

new运算符用于创建一个新的类型实例。它有以下三种形式。

① 对象创建表达式,用于创建一个类类型或值类型的实例。

② 数组创建表达式,用于创建一个数组类型实例。

③ 代表创建表达式,用于创建一个新的代表类型实例。

例如,下面三个式子分别创建了一个对象、数组和代表实例。

    01 class N{};N a=new N;
    02 string[]M=new string[5];
    03 delegate double L(int p); L f=new L(2);

6. typeof运算符

typeof运算符用于获得系统原型对象的类型,也就是Type类型。Type类包含关于值类型和引用类型的信息。

【范例5-21】 typeof运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator21”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-21.txt)。

    01  Type T=typeof(int);                //获取引用类型的信息
    02 Console.WriteLine("类型:{0}",T);  //输出结果
    03 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

7. checked和unchecked运算符

checked和unchecked运算符用于允许或者禁止对指定的运算进行检测,并指出相应的错误提示信息。

【范例5-22】 checked和unchecked运算符的使用。

⑴ 在Visual Studio 2013中新建C#控制台程序,项目名为“Operator22”。

⑵ 在Program.cs的Main方法中输入以下代码(代码5-22.txt)。

    01 byte s=255;                        //获取引用类型的信息
    02 checked
    03 {
    04   s+=2
    05 }
    06 Console.WriteLine(s.ToString());   //输出结果
    07 Console.ReadLine();

【代码详解】

代码2~5行执行checked操作。byte数据类型只能包含0~255的数,所以s值的增量会导致溢出,由于使用了checked运算符,所以在运行程序时编译器会检查溢出错误,并给出错误提示。

用checked运算符可以检查程序中所有未标记代码的溢出。如果要禁止溢出,可以用unchecked运算符,代码如下。

    01 short s=255;                       //获取引用类型的信息
    02 unchecked
    03 {
    04   s+=2;
    05 }
    06 Console.WriteLine(s.ToString());   //输出结果
    07 Console.ReadLine();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

可以看出,程序运行时没有出现异常,但数据会丢失,因为byte数据类型最大为255,溢出的位会被丢掉,所以s变量得到的值是1。

5.2 运算符优先级

本节视频教学录像:1分钟

表达式有多个运算符时,表达式的求值顺序由运算符的优先级决定,先取优先级较高的运算符进行计算,再将运算的结果运用于优先级较低的运算符。也遵从算术运算的“先乘除后加减”这样的规则,但可以用圆括号“()”改变运算的优先次序。C#运算的优先级如下表所示,越往上优先级越高。如果一个表达式中出现了同一个优先级的运算符,则运算顺序取决于其结合性,结合性是指运算符在表达式中从左到右或从右到左的运算顺序。

5.3 表达式

本节视频教学录像:1分钟

C#语言中的表达式类似于数学运算中的表达式,用运算符把操作数连接起来的式子就是表达式。操作数包括文本、变量、常量和表达式等。如下就是简单的表达式。

    01 int a=288;      //声明操作数变量并赋值
    02 a=a/2+6;        //改变a的值

在C#中,表达式在经过一系列运算后得到一个运算结果,结果的类型由参加运算的操作对象的数据类型决定。

5.4 高手点拨

本节视频教学录像:6分钟

在5.1节我们对运算符进行了基础讲解,其中一些运算符蕴含着技巧性的用法,在这里进行详细说明。

1. n++与++n

只要学习编程语言,学习运算符,都少不了学习自增、自减运算。++与--这两个运算符特殊的地方主要表现在,它们既可以用做前缀运算符(用在变量前面,如++n),也可以用做后缀运算符(用在变量后面,如n++)。不管作为前缀还是后缀,它作用的变量都会实现自增或者自减运算。

++与--的使用分为以下两种情况。

① 这种情况比较简单,没有歧义,就是纯粹的实现自增。被作用的变量不参与运算。

    01 int n=0;
    02 n++;                    //n的值为1
    03 ++n;                    //n的值为2

② 被作用的变量参与运算。

有歧义就在这个情况下,++或--作为后缀运算符时,其作用的变量先参与运算,再自增;++或--作为前缀运算符时,其作用的变量先自增或自减,再参与运算。

    01 int x=0,y=0;
    02 x=y++;        //x的值为0
    03 y=0;
    04 x=++y;        //x的值为1

当然,++与--也不是非使用不可,为了使程序没有歧义,增加可读性,对于参与运算的变量自增运算,我们可以分两步进行,代码如下。

    01 int x=0,y=0;
    02 x=y;           //x的值为0
    03 y=y+1;
    04 y=0;
    05 y=y+1;
    06 x=y;

这样就不用再纠结是先自增还是先运算了。

提示

“+”与“--”运算符只能作用于变量,对于非变量是不适用的,如x=(y+1)++就是非法表达式。

2. 用圆括号来保证运算优先

① 算术运算。

计算x与y的和的5倍。

    01 int x,y,z;
    02 z=(x+y)*5;

这是个比较简单的例子,却很能说明问题。当我们不知道“+”与“*”的优先级时,就可以使用括号来保证“+”的运算。

② 逻辑运算。

当x的值在[1,5]和[10,+∞)区间时,将y赋值为100,否则将y赋值为0。

    01 int x=6,y;
    02 if(x>=1&&x<=5||x>=10)//if((x>=1&&x<=5)||(x>=10))
    03 {
    04   y=100;
    05 }
    06 else
    07 y=0;

3. 使用&运算符实现状态控制

使用&运算符实现状态控制比较常见,它不仅运算速度快,而且非常节省空间,用一个int型就可以存储。这种方式的权限有查看、新增、修改、删除、保存权限,并给予用户查看、修改、保存的权限。以下代码判断该用户有什么权限,没有什么权限,然后输出判断结果。

    01 int None=0;                    //无权限
    02 int Scan=1;                    //查看
    03 int New=2;                     //新增
    04 int Modify=4;                  //修改
    05 int Delete=8;                  //删除
    06 int Save=16;                   //保存
    07 int userRight=None;            //默认没有权限
    08 userRight=Scan|Modify|Save;   //给用户查看、修改、保存权限
    09 //下面开始判断用户的权限
    10 if((userRight&Scan)==Scan)
    11 {
    12         Console.WriteLine("该用户具有查看权限。");
    13 }
    14 else
    15 {
    16         Console.WriteLine("该用户没有查看权限。");
    17 }
    18 if((userRight&New)==New)
    19 {
    20         Console.WriteLine("该用户具有新增权限。");
    21 }
    22 else
    23 {
    24         Console.WriteLine("该用户没有新增权限。");
    25 }
    26 if((userRight&Modify)==Modify)
    27 {
    28         Console.WriteLine("该用户具有修改权限。");
    29 }
    30 else
    31 {
    32         Console.WriteLine("该用户没有修改权限。");
    33 }
    34 if((userRight&Delete)==Delete)
    35 {
    36         Console.WriteLine("该用户具有删除权限。");
    37 }
    38 else
    39 {
    40         Console.WriteLine("该用户没有删除权限。");
    41 }
    42 if((userRight&Save)==Save)
    43 {
    44         Console.WriteLine("该用户具有保存权限。");
    45 }
    46 else
    47 {
    48         Console.WriteLine("该用户没有保存权限。");
    49 }
    50 Console.ReadKey();

【运行结果】

单击工具栏中的按钮,即可在控制台中输出如下图所示的结果。

这只是状态控制的简单举例,实际运用中,一般把状态设置为枚举,枚举更容易使用,有兴趣的读者可以自己实现一下。

5.5 实战练习

操作题

使用条件运算符判断指定年份是不是闰年。