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 的运算顺序。。
}
}
作者: zhangyaya 时间: 2014-12-25 20:05
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,相信可以轻易处理掉。另外,所谓的“短路”其实也是一种编译优化技术。
作者: shicuf 时间: 2014-12-28 22:21
伟大领袖马士兵曾经说过,纠结优先级的人都是在无理取闹,根本不用管,用括号就能摆平一切!作者: wang391141741 时间: 2014-12-29 13:50
&&和 ||是短路与和短路或,也就是说从左向右运算,只要有一个条件满足或者不满足即结束作者: 小徐_y8nUx 时间: 2014-12-30 10:38
我觉得你应该要知道这几个问题的优先级,再去分析,&和双&是不一样的,作者: 王德亮 时间: 2015-1-3 12:05
逻辑运算符的优先级是 ! > && > || 所以 f && f || f && f || f && f || f && f 把两个f&&f的计算是优先的 也就是全部都是false,全部false的或运算自然是false。不过,个人感觉,不需要在意这种东西,毕竟代码是为了表达我们的意图的,能让人一目了然是最好的作者: Joseph_liuxh 时间: 2015-1-3 21:28
[quote]cxj 发表于 2014-12-28 00:49
当f=false那样时,你可以把 b=f
这个答案逻辑清晰,回答的很到位
学习了。作者: wei336699 时间: 2015-1-4 17:57
根据优先级先算&& 再算|| f && f 全部的f&&f 都是false 然后算|| 因为都是false 所以都是false,最后b是false
如果你改成 b=f && f || f && f || f && f || t && t ; 同理 f&&f是false 但是 t&&t是true 最后是false||false||false||true || 只要有一个为true就是true 所以最后b=true作者: rxlyw 时间: 2015-1-4 19:36
&&的优先级高于||,&&两边都为真的时候,结果才为真,否则为假。||表示两边都为假的时候,结果才为假。由于&&优先级高于||,所以在程序中先运行&&,运行完之后再运行||。b=f&&f||f&&f||f&&f||f&&f,f&&f为假,所以就是b=假||假||假||假,假||假=假,所以b=假。当b=t&&t||t&&t||t&&t||t&&t,t&&t=真,b=真||真||真||真,真||真=真,所以b=真。作者: rxlyw 时间: 2015-1-4 19:38
&&的优先级高于||,&&两边都为真的时候,结果才为真,否则为假。||表示两边都为假的时候,结果才为假。由于&&优先级高于||,所以在程序中先运行&&,运行完之后再运行||。b=f&&f||f&&f||f&&f||f&&f,f&&f为假,所以就是b=假||假||假||假,假||假=假,所以b=假。当b=t&&t||t&&t||t&&t||t&&t,t&&t=真,b=真||真||真||真,真||真=真,所以b=真。作者: 落魄逗比 时间: 2015-1-5 14:47
这是逻辑运算符呀,都是同一级的,从左到右运算0&&0||0&&0||0&&0||0&&0=false,1&&1||1&&1||1&&1||1&&1||1&&1=1作者: 阿奔 时间: 2015-1-13 20:37
package ab.wkq;
public class Test111 {
public static void main(String [] args)
{
boolean b,t=true,f=false;
b=t && (t ||f) && f || f && f || f && f ;
System.out.println(b);
}
}
做了一个简单的测试,你可以用括号来证明,证明结果是&&先运行,然后才运行双或
根据优先级问题双与的优先级大于双或。
f && f || f && f || f && f || f && f 的运算顺序。。
先运行f&&f,然后依次运行II两旁boolean值。作者: manitowang 时间: 2015-1-15 10:50
你应该看看视频!里面教的很详细!作者: zhengyk 时间: 2015-1-19 17:31 本帖最后由 zhengyk 于 2015-1-19 17:38 编辑