`
ham
  • 浏览: 80233 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

&&运算符和||运算符的优先级问题

    博客分类:
  • Java
阅读更多
今天闲着没事`
写了一个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

难道是&&与||的优先级出了问题?

盼望各位高手加以解释一下~`
分享到:
评论
16 楼 ham 2008-06-01  
谢谢指导..终于弄清楚了.
15 楼 ddandyy 2008-05-30  
你的那句话  是被看成了

flag=( check(1) || ( check(2)&&check(3)&&check(4) ) )

问题是  &&的优先级高就不代表 他会先运行 || 的右边  而是说会把右边的当作一个值来看
从整个的判断顺序来说  是先大后小的  会先判断最外面的 ||
|| 的顺序还是从左到右的  所以只走了1就停下来了

至于你后来的

flag=(  ( check(1)&&check(2)&&check(3) ) || check(4) )
也是同理  也是先运行的  ||  他的左边是 ()  所以 就先运行了 里面的最左边的

这个例子里
优先级的意思是  会把 ( check(2)&&check(3)&&check(4) )  当做一个值来处理 也就是必须要当中全为true才会 为true

同理  比如  1 + 2 + ( 3 * 4 )  不是会 先把 3*4 运算完才 1 + 2 + 12
而是先 1+2 然后 3 + ()  发现有()后 先把3放在那 运行()里面的  得出最后的值之后  才和前面的3进行运算
14 楼 ham 2008-05-30  
ddandyy 写道
优先级与执行顺序无关


我也觉得是你所说的这样~``

但可能是一时半会理解不了吧..希望可以想通

谢了..
13 楼 ddandyy 2008-05-30  
优先级与执行顺序无关
12 楼 ham 2008-05-30  
whiller 写道
----------------
应该先计算后面的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.

具体先算哪个,应该是虚拟机决定的,跟优先级好像没关系.是这样嘛?




如果说是先计算哪个方法是JVM的事.那也说不通啊

因为&&的优先级要高于||

那就是它比较的时候就应该先比较&&前面的表达式
既然要比较&&前面的表达式
那就一定要执行这个表达式
应该会输出check(2)的值

难道虚拟机都不用执行check(2)就可以计算&&操作的表达式的值???


11 楼 ham 2008-05-29  
还是有点东西没想清楚..

脑子里面总是有些东西
很模糊很模糊.
伸手去抓.它又消失了...

我之前贴的那份代码还有点想不通`

当你改变&&和||运算符的位置
或者改变check()函数中所返回的true和false

程序的输出结果总是会有些让人摸不着头脑
是我想得太多了吗?
10 楼 ham 2008-05-29  
whiller 写道
----------------
应该先计算后面的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.

具体先算哪个,应该是虚拟机决定的,跟优先级好像没关系.是这样嘛?




原来是我自己理解错了...真小白.
看来思维只是在一线之间啊.
谢了.
9 楼 whiller 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

和楼主的结果也基本一致。
8 楼 whiller 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.

具体先算哪个,应该是虚拟机决定的,跟优先级好像没关系.是这样嘛?


7 楼 ham 2008-05-29  
看来我的帖子要石沉大海了~``哎...
6 楼 ham 2008-05-29  
shatuo 写道
JDK优化了,或运算的第一个操作数为真,因为结果一定为真,就继续不计算了,直接返回真。

||运算符的特性就是:
按顺序进行运算,只要找到一个为真的,就不继续运算,整个结果就返回真
这谈不上JDK的优化,只是这个操作符本身的特性,
这就是它区别于|运算符的地方.

而我现在谈的是优先级的问题,
就是说.它里面的值的输出顺序应该是什么样的.

不过还是谢谢你的评语.这帖子已经半天没人理了...能看到活人太高兴了
5 楼 shatuo 2008-05-29  
JDK优化了,或运算的第一个操作数为真,因为结果一定为真,就继续不计算了,直接返回真。
4 楼 ham 2008-05-29  
还是有问题......
如果是先执行函数`
那应该是最先输出1,2,3,4`
之后再输出执行&&和||后的结果

可是这段代码它只输出了一个1就没再输出了
证明它并没有执行完所有的函数

这到底是怎么回事啊`头都想大了,还是没点头絮...

来个人讨论一下啊.
我一个人这样下去都要想疯了~!
3 楼 ham 2008-05-29  
汗~``终于查到原因了`

我犯了个低级错误
boolean flag=(check(1)||check(2)&&check(3)&&check(4)); 
这句话`它首先要执行这些函数`
才再用这些函数的返回值进行||与&&运算

而不是先进行||和&&运算,再调用函数
2 楼 ham 2008-05-29  
whiller 写道
&& !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序

你可以去google一下`
所有的文章上面所画的优先级表格`
&&都是在||的上一行`
如果他们是平级关系`
&&与||就应该是同一单元格之中`
1 楼 whiller 2008-05-29  
&& !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序

相关推荐

Global site tag (gtag.js) - Google Analytics