我们都知道C#中运算符是用来连接表达式的,而运算符的优先级决定了表达式中运算执行的先后顺序。
通常,优先级高低顺序依次是:
增量、减量运算>算数运算>关系运算>逻辑运算>赋值运算。可参考下表:
PS:这里的赋值运算包含+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=
如果两个运算符有相同的优先级,那么左边的表达式要比右边的表达式先被处理。不过我们通常都会根据需要把先处理的用括号()括起来。
我们先简单回顾一下自增自减运算符:
b = a++;相当于b = a; a++; 先取值,后自增。b = --a;相当于--a; b = a;先自减,后取值
即区别在于使用b的值是在a自增(自减)之前还是之后。
接下来是实例展示():
先简单热身两道题
一,x = 5 + 3 * 2,输出x。在这里,x 被赋值为 11,而不是 16,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 5。这里大家理解肯定都没问题。
二, a = 10; b = 2; a *= b+8 ;输出a。这里就不能简单理解成a = a*b+8了,我认为将数值赋值给左边变量的过程中其实都有数值打包的一个过程,可以理解成有一个小括号即a=a*(b+8),所以最后输出结果为a=100。
下面是例题一:
static void Main(string[] args)
{
int i = 2;
int a = ++i * ++i * ++i ;
Console.WriteLine(a);
Console.ReadKey();
}
输出结果为:60
这题也不难理解,即a=((2+1)*(3+1)*(4+1))=60。
下面是例题二:
static void Main(string[] args)
{
int i = 2;
int a = ++i * i++ * ++i ;
Console.WriteLine(a);
Console.ReadKey();
}
输出结果为:45
这里通过和上一题对比可以看出,当一个表达式里出现多个自增自减运算符时,++在前在后它的自增和赋值两项操作是具有统一性的,和上面说的“区别在于使用b的值是在a自增(自减)之前还是之后”这种说法是自洽的。这道题的过程是a=((2+1)*(3)*(3+1+1))=45。可能这么看有些怪异,其实输出第二个i的值是为4的,但是计算时它并没有把4的值赋给i++(+1在赋值之后),也就是说i++是以3带入计算的,这也就导致最后一个++i其实是在4的基础上+1。
下面是例题三:
static void Main(string[] args)
{
int x = 8;
x += x--;
Console.WriteLine(x);//16
x += x %= 6;
Console.WriteLine(x);//20
int y = 8;
y += --y;
Console.WriteLine(y);//15
y += y %= 6;
Console.WriteLine( y);//18
Console.ReadKey();
}
输出结果为:16 20 15 18
相信仔细看了我前面所述运算规则的同学都知道这道题的运算过程,这里我也就不赘述了。
下面是例题四:
static void Main(string[] args)
{
Console.WriteLine(3 > 2 && 1 > 2 || 2 > 1);
Console.ReadKey();
}
输出结果为:True
因为“&&”的级别高,所以与“&&”相关联的条件首先会被当成一组条件,从而输出最后判断。
3>2 && 1>2 (返回False) False || 3>2 (返回Ture)
需要注意的是,通过运算符优先表又可以看出:位逻辑与&,位逻辑或|,逻辑与&&,逻辑或||,四者又存在从高到低的逻辑顺序。这里既然“&&”与“&”都表示“逻辑与”,那么它们的区别是什么呢?
“&&”与“&”的区别
首先,当两个表达式都为“真”的时候,“逻辑与”的结果才会是True,使用“&”会依次判断两个表达式,而“&&”则是针对bool类型的类进行判断,当第一个表达式为False时则不去判断第二个表达式,直接输出结果从而节省计算机的判断次数。
通常将这种在逻辑表达式中从左端表达式就能判断整个表达式值的方式为“短路”,相对应的始终执行完两边表达式的方式为“非短路”。即“&&”是“短路”运算符,“&”是“非短路”运算符。