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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
  做作业时遇到了一个棘手的问题。
我反省:学过的东西还是要勤温习,不然会忘的。





我简写了::

class Demo
{
      public static void main(String [] args)
      {
            boolean b,t=true,f=false;
            b=f && f || f && f || f && f || f && f ;
            System.out.println(b);
            //当然结果明显是FALSE,但是我很好奇这个长句是怎么运算的。于是用t替换一些f,然后看答案和我想的是否一样。可是就是不一样的啊。
            //一个多小时就搞这一题了。       大师,详细请教   f && f || f && f || f && f || f && f   的运算顺序。。
      }
}




最佳答案

查看完整内容

b=f && f || f && f || f && f || f && f ; 等价于 b=(f && f) || (f && f) ||( f && f) ||( f && f) ; 1. 假如编译器不优化的情况下:如上挨个计算每个&&,最后或||出答案 2.实际情况是,编译器不仅优化了,而且优化力度很大,化简为 b=f;因为四个相同的表达式或在一起,直接取一个表达式即可 b=f && f;同理,两个相同的表达式与了,结果肯定是那个表达式的值,于是b=f。 现代编译器的优化技术对这种case,相 ...

34 个回复

倒序浏览
     b=f && f || f && f || f && f || f && f ;
等价于    b=(f && f) || (f && f) ||( f && f) ||( f && f) ;
1. 假如编译器不优化的情况下:如上挨个计算每个&&,最后或||出答案
2.实际情况是,编译器不仅优化了,而且优化力度很大,化简为 b=f;因为四个相同的表达式或在一起,直接取一个表达式即可 b=f && f;同理,两个相同的表达式与了,结果肯定是那个表达式的值,于是b=f。
现代编译器的优化技术对这种case,相信可以轻易处理掉。另外,所谓的“短路”其实也是一种编译优化技术。

至于用t替换一些f之后的表达式求解,编译器的优化路径会发生改变,就得具体分析了,不可与原表达式直接对比。

以上是我的理解,欢迎大家讨论指正。
回复 使用道具 举报
又温习了一下
回复 使用道具 举报
我觉得 当都为F时 首先不要管|| 然后第 1,3,5,7 个f 直接短路&&  其值都为f  然后3个||  从左至右 依次 全部判断  最终为假
回复 使用道具 举报
对于全部是t 先不管||  全部判断&&左右值 全为真  然后判断||。  第一个||左为真 直接短路,则第一个||值为真,然后该值又把 第二||短路,,,依次后面无论有多少|| 都会被 连锁反应 其值为 真 ,,,我是这样认为的
回复 使用道具 举报
(f && f) || ( f && f) || ( f && f)  ||( f && f)
回复 使用道具 举报
优先级由高到低:小括号>负号>!>算数运算符>关系运算符>&&>||
回复 使用道具 举报
heimaheima123 来自手机 中级黑马 2014-12-26 21:22:19
8#
1、括号                      8、==!,!=   
2、++,--                   9、&
3、~,!                   10、^
4、*,/,%               11、|
5、+,-                      12、&&
6、>>,<<,>>>     13、||
7、>,<,>=,<=    14、?:
回复 使用道具 举报
楼上这么多,又有收获了
回复 使用道具 举报
亲,首先这是短路与,短路或。
再其次短路与的运算顺序大于逻辑或的运算顺序;
f 的话:
运算是这样的 :首先是短路与运算 (f && f) || ( f && f) || ( f && f)  ||( f && f),其中每个括号内 (f && f) 的与运算只会判断第一个 f  为假(短路与嘛)。然后就是短路或 ||运算,意义上就会成为 false || false || false || false依次运算短路或运算,结果为false; 总结为就是每个 && 先执行且只判断第一个f,然后再依次执行 || 运算。
t的话:
运算是这样的:首先是短路与运算(t && t) || ( t && t) || ( t && t)  ||( t && t), 因为 t 为ture,所以两个 t 都会被运算, 为ture;然后就是短路或 || 运算,意义上已成为 true || true || true || true,它只会判断第一个true就是结束运算(短路或嘛),运算结果为true;总结为就是先执行 && 运算,且左右两个 t 都会被判断,全总与 && 判断完后,运算 || 运算,且只判断第一个,后面都被短路。
望采纳。

点评

谢谢,学到了。  发表于 2015-1-11 19:19

评分

参与人数 1黑马币 +3 收起 理由
1017161726 + 3 很给力!

查看全部评分

回复 使用道具 举报
李票 中级黑马 2014-12-27 15:34:40
11#
先运算‘与’在运算‘或’同级之间从左往右运算,应该不会错的
回复 使用道具 举报
油茶籽 来自手机 中级黑马 2014-12-27 22:55:11
12#
学习了,应该关键是看短路与&&吧
回复 使用道具 举报
cxj 中级黑马 2014-12-28 00:49:15
13#
当f=false那样时,你可以把 b=f && f || f && f || f && f || f && f ;等价于b=f && *;因为已经有flase了,右边的不参与运算,所有结果为false。。。。同理,当用t将f换掉时,b=t && t || t && t || t && t || t && t ;等价于b=t && t || *;也等价于b = t || *,所有结果为true。
回复 使用道具 举报
Death、 发表于 2014-12-27 08:57
亲,首先这是短路与,短路或。
再其次短路与的运算顺序大于逻辑或的运算顺序;
f 的话:

学习了.
回复 使用道具 举报
是不是这样:b=f这就是false了,后边还用看吗?
回复 使用道具 举报
zhiyi 中级黑马 2014-12-28 18:11:32
16#
本帖最后由 zhiyi 于 2014-12-28 18:14 编辑

在Java中逻辑运算符“||”和“&&”优先级相同,结合方向为“从左至右”,你的式子相当于
b=(((((((f && f) || f) && f) || f) && f) || f) && f);
由于用的都是短路符,只运算到第一个“&&”就不运算了
回复 使用道具 举报
zhiyi 中级黑马 2014-12-28 18:13:10
17#
本帖最后由 zhiyi 于 2014-12-28 18:16 编辑

情况是这样的,
在Java中逻辑运算符“||”和“&&”优先级相同,结合方向为“从左至右”,你的式子相当于
b=(((((((f && f) || f) && f) || f) && f) || f) && f);

回复 使用道具 举报
shicuf 中级黑马 2014-12-28 22:21:56
18#
伟大领袖马士兵曾经说过,纠结优先级的人都是在无理取闹,根本不用管,用括号就能摆平一切!
回复 使用道具 举报
&&和 ||是短路与和短路或,也就是说从左向右运算,只要有一个条件满足或者不满足即结束
回复 使用道具 举报
小徐_y8nUx 来自手机 中级黑马 2014-12-30 10:38:00
20#
我觉得你应该要知道这几个问题的优先级,再去分析,&和双&是不一样的,
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马