5、运算符
- 常用的运算符合:+,-,*,/,%,空连接运算符
1) 算术运算符
l 一元运算符:++,--
int i = 10; int j = --i; int k = j++; 结果:i=9; j=10; k=9;
l 二元运算符:+,-,*,/,%
10/3 = 3; 10%3=1; 10%4=2; 10%5=0;
2) 逻辑运算符:返回类型永远是布尔类型
l 一元运算符:取非(!)
bool b = true; bool r = !b; 结果: ràfalse;
l 二元运算符:条件与(&&),条件或(||)
条件与符号的两边都是true的时候,整个表达式是true,只要有一个为false,则整个表达式为false
if ((5 > 3) && (7 > 4))
{
//会执行语句
}
条件或(||)符号的两边都是false的时候,整个表达式是false,只要有一个为true,则整个表达式为true
if ((5 > 3) || (4 > 7))
{
//会执行语句
}
3) 字符串运算符(+)
string str = “zhang” + “san”;//str = “zhangsan”;
4) 比较运算符:==,!= ,> ,>=,<,<=
l 判断是否相等:==。如:判断3和5是否相等: 3==5
l 判断是否不等:!=。如:判断3和5是否不等: 3!=5
l 判断是否大于>:如:判断3是否大于5: 3>5
l 判断是否大于等于>=:如:判断3是否大于等于5: 3>=5
l 判断是否小于<:如:判断3是否小于5: 3<5
l 判断是否小于等于<=:如:判断3是否小于等于5: 3<=5
注: double类型的数值和int类型的数值作比较是否相等时,不能用==,例:double 类型的5,可能是5.0001或者4.9999999,所以做比较不能用==,应该写成
double x=5; int y=5; if(Math.Abs(x-y)<1E-6){//相等}
5) 赋值运算符:=,+=,-=,/=,*=,%=
l 给变量赋值:= 如:int age = 10;
l 先加再赋值:+= 如:age +=5; àage = age + 5;
l -=,/=,*=,%=的算法和上面的一样。
6) 三元运算符:?:规则:判断?前面的表达式是否为真(true):若是,则返回:前面的那个数据,否则返回:后面的数据。简单的说,就是个if..else语句。
int c = (10 > 9)?7:6;
7) Checked和unChecked运算符
例: byte b=255;b++; Console.WriteLine(b.ToString());当加上Checked时,byte b=255; Checked{b++;} Console.WriteLine(b.ToString());注:用Checked编辑器选项进行编译,就可以检查所有未标记代码中的益处,如果把一段代码块标记为checked,CLR就会执行益处检查,如果益处就跑出OverflowException异常。如果要禁止检查,则可以把代码标记为unchecked。例: byte b=255;
Unchecked{b++;} Console.WriteLine(b.ToString());这样写就不会抛出异常,但会丢失数据,因为byte类型不能包含256,溢出位会丢失,所以b变量的得到的值是0。
注: unChecked是默认行为。只有需要把几行未检查的代码放在一段显式标记为Checked的打代码中,才需要显式地使用unChecked关键字。
8) is运算符
is运算符可以检查对象是否与特定的类型兼容。加绒表示对象或者该类型或者派生类型。例:要价差变量是否与Object理性兼容可使用线面的代码”
int i=10; if ( i is object ){ Console.WriteLine(“ I is an object”);}
注:int和所有的书籍类型一样,也从object继承而来;表达式 i is object将为true,并显示相应的消息。
9) as运算符
as运算符用于执行引用类型的显示类型转换的类型,与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回null值。
例:
Object o1=”Some String”;
Object o2=5;
String s1=o1 as string;//输出结果:s1=”Some String”;
String s2=02 as String;//输出结果:s2=null;
as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。
10) Sizeof运算符
使用Sizeof运算符可以确定栈中值类型需要的长度(单位是字节)。例:
Console.WriteLine(sizeof(int));
其结果显示数字4,因为int有4个字节。如果对于复杂类型(和非基元类型)使用sizeof运算符,就需要把代码放在unsafe块中。例:
Unsafe{Console.WriteLine(sizeof(Customer));}
11) Typeof运算符
Typeof运算符表示一个特定类型的System.Type对象。例:typeof(String)返回表示System.String类型的Type对象,在使用反射技术动态查找对象的相关信息时,这个运算符很有用。
12) 可空类型和运算符
可空类型与一元或二元运算符一起使用时,如果其中一个操作数或者两个操作数都是null,结果就是null。例:
int? a=null; int? b=a+4; //b的结果为null;
int? c =a*5; //c的结果为null
但是在比较可空类型时,只要一个操作数是null,比较结果就是false。既不能因为一个条件是false,就认为 对立面是true。例:
int? a=null;
if (a>=b) {Console.WriteLine(“a>=b”);}
else{Console.WriteLine(“a<b”);} //结果:a<b
13) 空连接运算符:??规则:判断其前面的数据是否为空(null),若不是整个表达式为其前面的数据,否则为其后面的数据。这个运算符发觉在两个操作数之间,第一个操作数是一个可空类型或引用类型;第二个操作数必须与第一个操作数的类型相同,或者可以隐含的转换成第一个操作数的类型。空合并运算符的计算如下:如果第一个操作数不是null,整个表达式就等于第一个操作数的值。如果第一个操作数是null整个表达式就等于第二个操作数的值。
int? a = 10; int? b = null; int? c = a??b;
注:如果一二个操作数不能隐含的转换为第一个操作数的类型,就会编译报错。
备注:如果想让那两个数据先运行,则用小括号()括起来。
一个经典的两个变量值交换:a=(a+b)-(b=a);
练习题:
1、比较|和||有什么不同? &和&& 有什么不同?
|算数或 例:A|B 对 A ,B都进行判断。
|| 逻辑或。只有当A为假的时候才会对B进行判断。若A为真,则不继续对B进行判断。
| & 会报所有条件判断完。
|| && 顺序判断,当不满足时,直接结束。
程序举例:
class Program
{
static void Main(string[] args)
{
int i = 3, j = 3;
if (i++ > 2 | i++ > 3 | i++ > 4)
Console.WriteLine(i);
if (j++ > 2 || j++ > 3 || j++ > 4)
Console.WriteLine(j);
}
}