A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jing迪 高级黑马   /  2013-9-1 08:05  /  1624 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

正在看视频其中有一题说的是短路比如下面这段话
int a = 10 ,b=5;
bool result = ++a >50 && ++b >1;

这句话老师说的是短路  意思是第一个算式++a>50不成立 就不运算后面的算式了   

但是不是说符号的优先级是一元的比二元的高吗??

那么应该是先算++a   然后算++b  然后再比较呀   怎么会直接算++a>50???

有人知道为啥么?   

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

12 个回复

倒序浏览
这么写会不会也短路?
int a = 1;
bool b1 = true||a>2;
回复 使用道具 举报
brucel50 发表于 2013-9-1 10:35
这么写会不会也短路?
int a = 1;
bool b1 = true||a>2;

你写的这个短路不短路无所谓呀 ,最后a的值没变

但是要是自加的话关系到a的值有变化呀  
回复 使用道具 举报
或许你可以这样理解,在Java中,java对&&运算符做了优化,当&&运算符左边的表达式的为假的时候,整个与运算表达式直接返回为假,而&&右边的表达式根本没有执行的机会。
回复 使用道具 举报
&&运算符,两个条件有一个条件为false时,则整个表达式为false,所以当++a条件为假时,则整个表达式不成立了,因而++b也就不运行了。。。

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
℡跡.... 发表于 2013-9-1 12:11
&&运算符,两个条件有一个条件为false时,则整个表达式为false,所以当++a条件为假时,则整个表达式不成立 ...

你还没看懂我的问题呀  

我是说
int a = 10 ,b=5;
bool result = ++a >50 && ++b >1;

上面这个算式  ++a和++b应该同时运算然后再运算++a>50这个关系运算 ,难道不是吗            

回复 使用道具 举报

NO,这个表达式分为两个条件语句,不可能同时执行两个条件语句的呀。
C#的顺序结构 从上至下,条件表达式里面的条件语句的判断肯定也是从左至右的呀。
回复 使用道具 举报
℡跡.... 发表于 2013-9-1 14:16
NO,这个表达式分为两个条件语句,不可能同时执行两个条件语句的呀。
C#的顺序结构 从上至下,条件表达式 ...

不是同级别的才从左到右么?
++是一元运算符 不是应该是只要有就先加吗?

逻辑运算符的优先级没有++高 不是吗???
回复 使用道具 举报
jing迪 发表于 2013-9-1 14:24
不是同级别的才从左到右么?
++是一元运算符 不是应该是只要有就先加吗?

条件“与”运算符 (&&) 执行其 bool 操作数的逻辑“与”运算,但仅在必要时才计算第二个操作数。
x && y
但如果 x是 false, y 不会计算,因为操作的结果是 false ,无论 y 的值为多少。 这被称作为“短路”计算。
x和y是分别是两个条件,而++a或者++b只隶属于其中的一个条件,一个条件才会有运算符的优先级,两个条件间的与运算就不涉及运算符的优先级了吧。所以只会先执行第一个如果为true 才会去执行第二个,如果第一个为false了那么第二个就不执行了。
回复 使用道具 举报
在MSDN的C#参考中, 关系运算符 >、< 优先级确实比逻辑运算符 &&、|| 的优先级要高
但又规定了&&第一个操作数为false时不计算第二个操作数、||第一个操作数为true时不计算第二个操作数

所以我觉得你这个疑问并不是你我理解有误,而是微软自己都说不清楚。

int a = 10 ,b=5;
bool result = ++a >50 && ++b >1;
我觉得可以这样理解:
按顺序应该先计算++a>50,次计算++b>1,最后计算 &&
但&&具有一种特殊的优先级,
它要进行三次判断,即第一操作数真或假、第二操作数真或假、两操作数组合后的真假,
一旦它的第一个操作数真假可以判断时,它就越过其它运算符抢先执行第一步判断,
如果有必要进行后两步计算,它就交还运算权让第二个操作数进行运算,当第二操作数计算结果出来后,它再接着执行判断
++a>50结果一出来,&&就抢先判断,是false,&&整个表达式都为false,没必要再进行后面的计算了。

看看下面的代码:
  1.         static void Main(string[] args)
  2.         {
  3.             int a = 10, b = 5, c = 1;
  4.             bool result = ++a < 50 && ++b > 1 || ++c > 1;
  5.             Console.WriteLine("{0}\t{1}\t{2}\t{3}",result,a,b,c);

  6.             a = 10; b = 5; c = 1;
  7.             bool result2 = ++a < 50 || ++b > 1 && ++c > 1;
  8.             Console.WriteLine("{0}\t{1}\t{2}\t{3}", result2, a, b, c);

  9.             a = 10; b = 5; c = 1;
  10.             bool result3 = ++a > 50 || ++b > 1 && ++c > 1;
  11.             Console.WriteLine("{0}\t{1}\t{2}\t{3}", result3, a, b, c);

  12.             a = 10; b = 5; c = 1;
  13.             bool result4 = ++a > 50 || ++b < 1 && ++c > 1;
  14.             Console.WriteLine("{0}\t{1}\t{2}\t{3}", result4, a, b, c);


  15.             Console.ReadKey();
  16.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
jing迪 来自手机 高级黑马 2013-9-2 11:18:27
11#
好吧,这个还是不是很理解,等以后学的多了应该就会了
回复 使用道具 举报
这道题你可以这样理解:
&&两边连接的是两个条件。
所以式子可以这样写 bool result =(++a>50)&&(b++>1)
这样是不是一下就豁然开朗了。。哈哈{:soso_e120:}
很多时候我们要学会变通,而不是一味的问为什么。思维发散的太远收不回来就麻烦了。{:soso_e152:}

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
++,>,&&这三个的优先级从大到小顺序,而&&是只要一个不成立都不成立,因为++a>50已经不成了,所以已经得出结果为false,后面的也++b运算了,也没有意义,所以说++b>1短路

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马