运算顺序
c#中的数学运算会考虑先乘除后加减,有括号先算括号。
那如果同时又存在关系运算和逻辑运算呢。
复杂的表达式就要仔细分析一下了。
你可以在官网找到对运算顺序的详细介绍。点击这里
这里会对其进行概括
内容访问
内容访问例如访问数组元素,访问内容,执行方法。
他们也是一种表达式,虽然代表了一个值但确实要经过很多步骤才能获得。
string s = "hello";
var l = s.Length;
var t=s.ToString();
var n = new string(s);
var a = s[0];
此外还有i++和i--。
这个运算遇到的时候会完成取值。
但一旦取值完成就会执行++或--的操作。
前置一元运算符
前置一元运算符意味着对一个值进行修饰。
这包括数字的取正和取负。位运算和逻辑运算的非,强制转换,++i和--i。
int i = 12;
var a = +i;
var b=- i;
var c = ~i;
var d = (float)i;
范围,switch,with表达式
switch表达式和with表达式通常不会和其他表达式混杂在一起。
而范围运算,常见于找出某个元素,然后偏移一定距离。
但是,由于范围的构建比相加要优先,所以必须打括号。
string s = "X:\\a.txt";
int index=s.IndexOf('\\');//找到字符串中\的位置
string s2 = s[(index+1)..];//必须打括号
数学运算
数学运算中,乘除法和取余数(%),优先级高于加减法。
位移
位移的优先级比数学运算低。意味着先要算出结果才会进行位移。
关系运算
关系运算包括大于,小于,不大于,不小于,和模式匹配。
而相等和不等的优先级低于上述的关系运算。
逻辑运算
逻辑运算中,非和位取反是前置一元运算,优先级最高。
然后是与高于或。
位运算高于逻辑运算。
Console.WriteLine(true | true & false); // output: True
Console.WriteLine((true | true) & false); // output: False
Console.WriteLine(true || true & false); // output: True
Console.WriteLine(true | true && false); // output: False
条件运算
条件运算包括三元运算和空合并运算。
他们本身包含一个条件和子值。
会先执行条件,然后执行需要的子值。
如果条件运算参杂到其他运算中,需要给他打括号。
int i = 12;
var f = 13.6f + i < 10 ? i : i - 10;
var f2 = 13.6f + (i < 10 ? i : i - 10);
int i1 = f;
int i2 = f2;//f会被认为是int,而f2会认为是float
赋值运算
赋值运算是优先级最低的。
赋值运算本身也可以取值,因此可以混杂在表达式中。
int i;
string s = "h" + (i = 66);
赋值运算会优先计算右侧的值。
所以在遇到多重赋值时例如
int a,b,c,d;
a=b=c=d=15;
这个式子中a是最后被赋值的。
而赋值运算的取值是计算出要给变量赋值的值,而不是赋值完成后变量的值。
(a=12,执行完这条语句后再对a进行取值,a不一定就是12)