论坛首页 入门技术论坛

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

浏览 5991 次
该帖已经被评为新手帖
作者 正文
   发表时间: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

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

盼望各位高手加以解释一下~`
   发表时间:2008-05-29  
&& !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序
0 请登录后投票
   发表时间:2008-05-29  
whiller 写道
&& !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序

你可以去google一下`
所有的文章上面所画的优先级表格`
&&都是在||的上一行`
如果他们是平级关系`
&&与||就应该是同一单元格之中`
0 请登录后投票
   发表时间:2008-05-29  
汗~``终于查到原因了`

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

而不是先进行||和&&运算,再调用函数
0 请登录后投票
   发表时间:2008-05-29  
还是有问题......
如果是先执行函数`
那应该是最先输出1,2,3,4`
之后再输出执行&&和||后的结果

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

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

来个人讨论一下啊.
我一个人这样下去都要想疯了~!
0 请登录后投票
   发表时间:2008-05-29  
JDK优化了,或运算的第一个操作数为真,因为结果一定为真,就继续不计算了,直接返回真。
0 请登录后投票
   发表时间:2008-05-29  
shatuo 写道
JDK优化了,或运算的第一个操作数为真,因为结果一定为真,就继续不计算了,直接返回真。

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

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

不过还是谢谢你的评语.这帖子已经半天没人理了...能看到活人太高兴了
0 请登录后投票
   发表时间:2008-05-29  
看来我的帖子要石沉大海了~``哎...
0 请登录后投票
   发表时间: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.

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


0 请登录后投票
   发表时间: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

和楼主的结果也基本一致。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics