在MSDN的C#参考中, 关系运算符 >、< 优先级确实比逻辑运算符 &&、|| 的优先级要高
但又规定了&&第一个操作数为false时不计算第二个操作数、||第一个操作数为true时不计算第二个操作数
所以我觉得你这个疑问并不是你我理解有误,而是微软自己都说不清楚。
int a = 10 ,b=5;
bool result = ++a >50 && ++b >1;
我觉得可以这样理解:
按顺序应该先计算++a>50,次计算++b>1,最后计算 &&
但&&具有一种特殊的优先级,
它要进行三次判断,即第一操作数真或假、第二操作数真或假、两操作数组合后的真假,
一旦它的第一个操作数真假可以判断时,它就越过其它运算符抢先执行第一步判断,
如果有必要进行后两步计算,它就交还运算权让第二个操作数进行运算,当第二操作数计算结果出来后,它再接着执行判断
++a>50结果一出来,&&就抢先判断,是false,&&整个表达式都为false,没必要再进行后面的计算了。
看看下面的代码:- static void Main(string[] args)
- {
- int a = 10, b = 5, c = 1;
- bool result = ++a < 50 && ++b > 1 || ++c > 1;
- Console.WriteLine("{0}\t{1}\t{2}\t{3}",result,a,b,c);
- a = 10; b = 5; c = 1;
- bool result2 = ++a < 50 || ++b > 1 && ++c > 1;
- Console.WriteLine("{0}\t{1}\t{2}\t{3}", result2, a, b, c);
- a = 10; b = 5; c = 1;
- bool result3 = ++a > 50 || ++b > 1 && ++c > 1;
- Console.WriteLine("{0}\t{1}\t{2}\t{3}", result3, a, b, c);
- a = 10; b = 5; c = 1;
- bool result4 = ++a > 50 || ++b < 1 && ++c > 1;
- Console.WriteLine("{0}\t{1}\t{2}\t{3}", result4, a, b, c);
- Console.ReadKey();
- }
复制代码 |