`
ham
  • 浏览: 81511 次
  • 性别: 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  
&& !!平级关系,类似于加号和减号的关系,都是按照从左到右的顺序

相关推荐

    逻辑运算符&逻辑表达式&逻辑运算符优先级&闰年问题.pdf

    本文将要详细介绍逻辑运算符、逻辑表达式、逻辑运算符优先级和闰年问题,涵盖逻辑非、逻辑与、逻辑或的概念和应用,旨在帮助读者深入理解逻辑运算符的使用和应用。 一、逻辑运算符 逻辑运算符是指在编程语言中用于...

    浅谈JS运算符&&和|| 及其优先级|angluo-javascript-159717.pdf

    JS运算符优先级的顺序大致如下(从高到低): 1. 圆括号内的表达式 2. 字段访问、数组下标、函数调用以及表达式分组 3. 一元运算符、返回数据类型、对象创建、未定义值 4. 乘法、除法、取模 5. 加法、减法、字符串...

    C语言各运算符优先级及函数大全

    下面将详细介绍C语言中的运算符优先级和相关知识点。 一、数组下标运算符[] 数组下标运算符是C语言中最基本的运算符之一,它用于访问数组元素。例如,数组名[常量表达式],其中数组名是数组的名称,常量表达式是...

    C++实战篇:运算符优先级

    C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战篇:运算符优先级 C++实战...

    Verilog HDL 运算符 优先级

    Verilog HDL 运算符优先级是指在 Verilog HDL 中各种运算符的执行顺序和优先级,了解运算符优先级对编写高效的 Verilog 代码非常重要。 Verilog HDL 运算符优先级可以分为以下几类: 一、位选择和部分选择运算符 ...

    js中的||和&&运算符(运算符两侧为数字的情况)

    ### 三、运算符优先级 在JavaScript中,逻辑与(&&)的优先级高于逻辑或(||)。这意味着当两者同时出现在一个表达式中时,`&&`会被优先计算。例如: ```javascript console.log(1 && 0 || 0); // 输出 0 console.log...

    C语言运算符优先级.pdf

    了解C语言的运算符优先级对于编写清晰、正确的代码至关重要。没有正确地理解和应用优先级,可能会导致程序的逻辑错误或性能问题。因此,在编程时,应当养成使用括号明确优先级的习惯,或者根据已经掌握的优先级表来...

    C语言运算符的优先级与结合性

    理解C语言中的运算符优先级和结合性对于编写正确的程序至关重要。通过上文的介绍和示例,我们了解到各种运算符的优先级及其结合性规则。掌握这些知识可以帮助我们更准确地控制表达式的计算顺序,避免因优先级和结合...

    C++运算符优先级表

    C++运算符优先级表 C++ 运算符优先级表是一份非常重要的参考资源,对于C++开发者来说是必不可少...C++运算符优先级表是C++开发者必备的知识,了解每个运算符的优先级和用法可以帮助开发者编写出更加高效、可读的代码。

    C语言运算符优先级表.pdf

    C语言运算符优先级表是指在C语言中所有运算符的优先级顺序和结合方向的总结。正确理解和掌握C语言运算符的优先级和结合方向对于编写正确和高效的C语言程序非常重要。 以下是C语言运算符的优先级表: 1. 后置自增...

    C#运算符优先级解释

    在深入探讨C#运算符的优先级之前,我们先来明确一下什么是运算符以及优先级在编程中的作用。...因此,在学习和应用运算符优先级时,始终保持对代码质量和用户体验的关注,将使你成为一个更加优秀的程序员。

    C语言中的运算符及其优先级.pdf

    C语言中的运算符及其优先级 C语言中的运算符是编程语言中最基本的组成部分,它们用于执行各种算术、逻辑、...C语言中的运算符及其优先级是编程语言的基础知识,理解和熟练掌握这些知识是编写高效、正确的代码的前提。

    C语言运算符优先级和结合性表

    ### C语言运算符优先级和结合性 在C语言中,理解运算符的优先级和结合性对于正确地编写和解读代码至关重要。本篇文章将基于提供的C语言运算符优先级和结合性表进行详细的解析。 #### 一、运算符优先级 运算符...

    运算符优先级表

    包含了全部的C++运算符,内容非常详细,十分清晰,易懂。

    C语言运算符优先级和口诀.doc

    C语言中的运算符优先级是编程时非常关键的知识点,它决定了表达式中不同运算的执行顺序。了解这些规则能帮助我们写出更清晰、更准确的...在编程实践中,熟练掌握运算符优先级和结合性,能显著提高编程效率和代码质量。

    C语言运算符优先级

    由于运算符优先级和结合性规则相对复杂,建议在编写代码时尽量使用括号明确运算的顺序,以提高代码的可读性和可维护性。 为了加深理解,这里整理C语言中各类运算符的优先级和结合性顺序: 1. 单目运算符(右结合)...

    C语言运算符优先级.docx

    掌握C语言中的运算符优先级是编写正确和高效代码的基础。不同的运算符具有不同的优先级,这会影响表达式的计算顺序。此外,了解不同运算符的结合性也是非常重要的,因为它可以帮助我们更好地理解和控制表达式的计算...

    C语言运算符的优先级

    C语言运算符的优先级可以分为15个级别,每个级别都有其特定的运算符和结合方向。 第一级:数组下标、圆括号、成员选择(对象)和成员选择(指针) * 数组下标:数组名[常量表达式] * 圆括号:(表达式)或函数名...

    C++运算符的优先级和结合性

    以下是一个简化的C++运算符优先级和结合性表格: | 运算符类别 | 运算符 | 优先级 | 结合性 | | --- | --- | --- | --- | | 赋值运算符 | =, +=, -=, *=, /=, %= | 1 | 右结合 | | 算术运算符 | +, -, *, /, % | 2 ...

Global site tag (gtag.js) - Google Analytics