.NET基础2
这一篇我们来讲解C#中的运算符
1. C#中的算术运算符
5个算数运算符:+ - * / %
它们都是二元运算符,* / % 的运算优先级相同,并且高于 + - ,+ - 的运算优先级也是相同的。我们可以通过小括号来改变计算的优先级,注意:小括号一定要成对出现。
运算符两边的操作数的类型,要求一致,运算得到的结果也会与操作数的类型一致。
int x = 10, y = 3; //得到的结果是 3 Console.WriteLine("num = {0}", x / y * 1.0);
x / y * 1.0 这个表达式,先计算 x/y ,得到结果为3, 3再乘以1.0,结果是3.0,但输出的时候,不会输出3.0,而是3
double vvv = 3 * 1.0; //得到结果是 3 Console.WriteLine("vvv = {0}",vvv);
int类型 乘以 double类型,结果是会被自动转换成double类型。
int x = 10, y = 3; //得到的结果是 3.33333333333333 Console.WriteLine("num = {0}", x / (y * 1.0));
2. C#中的赋值运算符
6个赋值运算符: = += -= *= /= %=
它们在进行运算时,要求参与运算的操作数的类型必须相同,并且其运算结果也与操作数的类型相同。假如,参与运算的操作数的类型不一致时,会根据类型自动转换规则进行转换。
这6个运算符的优先级都相同,在所有运算符中优先级是最低的。
3. C#中的逻辑运算符
3个逻辑运算符: &&(且) ||(或) !(非)
只有 ! 是一元运算符,其他的都是二元运算符
优先级 ! > && > ||
参与运算的必须是计算结果为bool类型的表达式,如 4 > 2
(表达式) && (表达式) 只有当两个表达式全为true的时候,结果才为true
(表达式) || (表达式) 只有当两个表达式全为false的时候,结果才为false
!(表达式) 进行取反操作,表达式为true的时候,结果为false;反之为true
注意: && || 会出现短路的情况
int a = 10; int b = 5; //当逻辑与中前面一个表达式的结果为false,后面那个表达式就不参与运算了,造成短路 bool result = ++a > 50 && ++b > 1; Console.WriteLine("a = {0} b = {1}",a,b); //a = 11 b = 5 //当逻辑或中前面一个表达式的结果为true,后面那个表达式就不参与运算了,造成短路 bool res = ++a < 50 || ++b < 1; Console.WriteLine("a = {0} b = {1}", a, b); //a = 12 b = 5
4. C#中的关系运算符
6个关系运算符: > < == != >= <=
它们的运算结果都是bool类型,参与运算的操作数的类型也必须相同。
5. C#中的自增、自减运算符
包括这两种: ++ -- 运算符在操作数前后的位置又可以分为前置和后置
后置的优先级高于前置
1. 后置
当number++ 或 number-- 参与表达式运算时,由于运算符在number后面,所以在运算时,先用number的值参与表达式的运算,再将number的值+1 或 -1。
int res = 10 + number++; 我们可以理解成: int res = 10 + number; number = number + 1;
于是我们得到结论:++ -- 后置的时候,无论所在的表达式有多么复杂,都要先等表达式计算完成后,在执行 ++ 或 -- 的运算。
int age = 18; /*后置自加位于表达式中时,无论表达式有多么复杂,只有等到表达式 运算完成的时候,才执行后置的++ */ int sum = (age++ + 12) * 3 - 10; //上面这句话相当于 //int sum = (age + 12) * 3 - 10; //age++; Console.WriteLine("age = {0}", age); // age = 19 Console.WriteLine("sum = {0}", sum); // sum = 80
2. 前置
当++number 或 -- number参与表达式运算时,由于运算符在number前面,所以在运算时,先将number的值+1 或 -1,再用number的值参与表达式的运算 。
int res = 10 + ++number; 我们可以理解成: number = number + 1; int res = 10 + number;
例子:
int var1, var2 = 5, var3 = 6; var1 = var2++ * --var3; //var1 = 25,var2 = 6,var3 = 5 Console.WriteLine("var1 = {0},var2 = {1},var3 = {2}", var1, var2, var3); var1 = 0; var2 = 5; var3 = 6; var1 = ++var2 * var3--; //var1 = 36,var2 = 6,var3 = 5; Console.WriteLine("var1 = {0},var2 = {1},var3 = {2}", var1, var2, var3);
6. C#中三元运算符
语法: 条件 ? 结果1 : 结果2
int a = 2; int c = 3; int b = (a>c) ? a : c; // b 的值为3
与 if - else语句等价
int a = 2; int c = 3; int b; if ( a > c ) { b = a; } else { b = c; }
7. C#中运算符表
按照运算符的优先级进行排列
这里列举一些常用的运算的优先级,下面按照从高到低的顺序排列了运算符的优先级。关于运算符的详细情况,请查阅 https://msdn.microsoft.com/zh-cn/library/ms173145.aspx
算术运算符中 * / % 的优先级高于 + -
8. C#中运算符的结合性
按方向来分,分为左结合和右结合
左结合运算符按从左到右的顺序计算。 例如,x * y / z 将计算为 (x * y) / z。 右结合运算符按从右到左的顺序计算。 例如,赋值运算符是右关联的。
赋值运算符和三元运算符 (?:) 是右结合运算符。 其他所有二元运算符都是左结合运算符。
无论表达式中的运算符是左结合运算符还是右结合运算符,都将先从左至右评估各表达式的操作数。
9. C#中运算符重载
对于自定义类和结构,你可以更改运算符的行为。 此过程称为“运算符重载”。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。