锁定老帖子 主题:&&运算符和||运算符的优先级问题
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-28
写了一个java文件测试&&和||的优先级 代码如下 public class Test { public static void main(String [] args){ boolean flag=(check(1)||check(2)&&check(3)&&check(4)); System.out.println(flag); } public static boolean check(int value){ System.out.println(value); if(value==1){ return true; }else if(value==2){ return true; }else if(value==3){ return true; }else if(value==4){ return true; } } } 代码的输出结果为: 1 true 本来&&的优先级要高于|| 那么在这段代码中计算flag的值时 应该先计算后面的check(2)&&check(3)&&check(4)的值~` 输的内容就应该先输出check(2),check(3)或check(4)中的一个` 可是事实并不是这样`` 代码仍然是从前向后执行~`先输出的值是 1 感觉好像||的优先级高于&& 但是我把将第一个||替换为&&,最后一个&&替换为|| 它的执行结果仍然是先输出1 难道是&&与||的优先级出了问题? 盼望各位高手加以解释一下~` 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-29
&& !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序
|
|
返回顶楼 | |
发表时间:2008-05-29
whiller 写道 && !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序 你可以去google一下` 所有的文章上面所画的优先级表格` &&都是在||的上一行` 如果他们是平级关系` &&与||就应该是同一单元格之中` |
|
返回顶楼 | |
发表时间:2008-05-29
汗~``终于查到原因了`
我犯了个低级错误 boolean flag=(check(1)||check(2)&&check(3)&&check(4)); 这句话`它首先要执行这些函数` 才再用这些函数的返回值进行||与&&运算 而不是先进行||和&&运算,再调用函数 |
|
返回顶楼 | |
发表时间:2008-05-29
还是有问题......
如果是先执行函数` 那应该是最先输出1,2,3,4` 之后再输出执行&&和||后的结果 可是这段代码它只输出了一个1就没再输出了 证明它并没有执行完所有的函数 这到底是怎么回事啊`头都想大了,还是没点头絮... 来个人讨论一下啊. 我一个人这样下去都要想疯了~! |
|
返回顶楼 | |
发表时间:2008-05-29
JDK优化了,或运算的第一个操作数为真,因为结果一定为真,就继续不计算了,直接返回真。
|
|
返回顶楼 | |
发表时间:2008-05-29
shatuo 写道 JDK优化了,或运算的第一个操作数为真,因为结果一定为真,就继续不计算了,直接返回真。 ||运算符的特性就是: 按顺序进行运算,只要找到一个为真的,就不继续运算,整个结果就返回真 这谈不上JDK的优化,只是这个操作符本身的特性, 这就是它区别于|运算符的地方. 而我现在谈的是优先级的问题, 就是说.它里面的值的输出顺序应该是什么样的. 不过还是谢谢你的评语.这帖子已经半天没人理了...能看到活人太高兴了 |
|
返回顶楼 | |
发表时间:2008-05-29
看来我的帖子要石沉大海了~``哎...
|
|
返回顶楼 | |
发表时间:2008-05-29
----------------
应该先计算后面的check(2)&&check(3)&&check(4)的值~` -------------- 理解偏了吧? &&优先级比||高,只能说明: check(1)||check(2)&&check(3)&&check(4) 等价于 check(1)|| ( check(2)&&check(3)&&check(4) ) 但并不是说先计算 check(2)&&check(3)&&check(4) 再算check(1)||XXX. 具体先算哪个,应该是虚拟机决定的,跟优先级好像没关系.是这样嘛? |
|
返回顶楼 | |
发表时间:2008-05-29
public static void main(String[] args) { int result=check(2)*(check(3) + check(4)); System.out.println(result); } public static int check(int value){ System.out.println(value); return value; } 上面是我改写的一个类似的例子,发现运行结果如下: 2 3 4 14 和楼主的结果也基本一致。 |
|
返回顶楼 | |