Java 逻辑运算符优先级
通过Java运算符优先级表: “|”逻辑OR运算符的优先级高于“&&”逻辑AND运算符 我用下面的代码检查了上述事实Java 逻辑运算符优先级,java,Java,通过Java运算符优先级表: “|”逻辑OR运算符的优先级高于“&&”逻辑AND运算符 我用下面的代码检查了上述事实 int y = 5; int x = 2; if( x++ > 2 && ++y > 2 | true ) ; //do nothing System.out.println("x = " + x + " y = " + y); 但在这一行上,输出为- x = 3 y = 5 显示x++首先进行计算 甚至我在|周围的条件中
int y = 5;
int x = 2;
if( x++ > 2 && ++y > 2 | true )
; //do nothing
System.out.println("x = " + x + " y = " + y);
但在这一行上,输出为-
x = 3 y = 5
显示x++首先进行计算
甚至我在|周围的条件中加了括号
if( x++ > 2 && (++y > 2 | true) )
;
但我还是得到了同样的结果
为什么运算符优先级在这种情况下不起作用?|是按位OR运算符。你在找| |。它类似,但不同之处在于它具有更高的优先级,并且不应用短路评估
我明白你现在的真正要求了。您想知道为什么如果&&的优先级最低,那么在最终到达之前不会对语句的其余部分求值。所以在
x++ > 2 && ++y > 2 | true
它应该计算x++>2,然后计算+y>2 | true,最后应用&&。答案是&&应用短路评估。当然,它可以计算所有内容,然后应用其效果,这就是按位运算符所做的。然而,这不是因为
if (a && b && ...)
其行为应该与
if (a) {
if (b) {
...
}
}
运算符优先级与您预期的一样,但是,由于运算符的属性,计算会提前终止。那么回到
x++ > 2 && ++y > 2 | true
我们看到x++>2为假,因此不计算+y>2 |真 |是按位OR运算符。你在找| |。它类似,但不同之处在于它具有更高的优先级,并且不应用短路评估
我明白你现在的真正要求了。您想知道为什么如果&&的优先级最低,那么在最终到达之前不会对语句的其余部分求值。所以在
x++ > 2 && ++y > 2 | true
它应该计算x++>2,然后计算+y>2 | true,最后应用&&。答案是&&应用短路评估。当然,它可以计算所有内容,然后应用其效果,这就是按位运算符所做的。然而,这不是因为
if (a && b && ...)
其行为应该与
if (a) {
if (b) {
...
}
}
运算符优先级与您预期的一样,但是,由于运算符的属性,计算会提前终止。那么回到
x++ > 2 && ++y > 2 | true
我们看到x++>2为假,因此不计算+y>2 |真 这不是逻辑运算符。这是位运算符。它将评估所有内容-也就是说,它不会短路-如果有任何内容将该位翻转为1,它将保持在1直到被否定 以下是这些陈述的评估方法: x++>2&&++y>2 | |真->真。我们用逻辑AND失败,但用逻辑OR成功。对于短路,我们不会继续计算逻辑AND的任何部分,因为x>2为false x++>2&&++y>2 | | true->false,因为我们将由于x>2不为true而短路 如果您实际上不希望出现短路行为,那么也可以使用按位AND,您将得到预期的求值块
x++>2&+++y>2 | true仍将计算为true,但x和y的值将分别更改为3和6。这不是逻辑运算符。这是位运算符。它将评估所有内容-也就是说,它不会短路-如果有任何内容将该位翻转为1,它将保持在1直到被否定 以下是这些陈述的评估方法: x++>2&&++y>2 | |真->真。我们用逻辑AND失败,但用逻辑OR成功。对于短路,我们不会继续计算逻辑AND的任何部分,因为x>2为false x++>2&&++y>2 | | true->false,因为我们将由于x>2不为true而短路 如果您实际上不希望出现短路行为,那么也可以使用按位AND,您将得到预期的求值块 x++>2&+++y>2 | true仍将计算为true,但x和y的值将分别更改为3和6。试试这个
if( x++ > 2 && ++y > 2 || true )
您使用的是位运算符而不是逻辑运算符
试试这个
if( x++ > 2 && ++y > 2 || true )
您使用的是位运算符而不是逻辑运算符
因为无论你放置大括号是什么,它都会从左到右开始,因为在&&&的情况下,它被优化为检查第一个条件,它得到false,那么为什么要转到第二个条件,不管大括号在那里,第二个x++将被执行,条件得到false,因此,它打印的是相同的输出,但如果您使用| |
class Test{
public static void main(String[] args) {
int x=2,y=5;
if( x++ > 2 || (++y > 2 | true) )
;
System.out.println(x +" "+y );
}
}
它将打印36,因为| |发生时,第一个条件为false,但当第二个条件为true时,++y>2求值为true,布尔值之间根据位或给出输出,true或true为true。因为无论您放置大括号什么,它都将从左到右开始,因为在&,它被优化为检查第一个条件,它变为false,那么为什么要转到第二个条件,不管有大括号,第二个x++将被执行,条件变为false,所以它打印相同的输出,但是当您使用| |
class Test{
public static void main(String[] args) {
int x=2,y=5;
if( x++ > 2 || (++y > 2 | true) )
;
System.out.println(x +" "+y );
}
}
它将打印3 6,因为| |发生时,第一个条件为false,但当第二个条件为true时,++y>2求值为true。布尔值之间的输出基于位或,true或true为true。即使运算符|具有更高的优先级,在程序检查是否需要计算&&的右侧时,甚至没有发现运算符
将该语句视为true&&true | true。计算方法如下:
检查true&&。。。看看是否需要进一步的操作,情况就是这样。
更高优先级:执行操作true | true->true。
低优先级:执行操作true&&true->true。
在您的例子中,由于x++>2给出false,因此永远不会触及和的右侧。即使运算符|具有更高的优先级,也不会在程序检查是否需要计算和的右侧时发现运算符
将该语句视为true&&true | true。计算方法如下:
检查true&&。。。看看是否需要进一步的操作,情况就是这样。
更高优先级:执行操作true | true->true。
低优先级:执行操作true&&true->true。
在您的例子中,由于x++>2给出false,因此&&的右侧甚至从未被碰过。逻辑运算符:&&&、| |、&、|和^只能用于计算两个
布尔表达式
&&和&之间的区别在于&&运算符
如果左操作数的计算结果为false,则不必麻烦测试右操作数,因为
&&表达式的结果永远不可能为真
| |和|之间的区别是
如果左操作数的计算结果为
是的,因为在那一点上已经知道结果是真的
位运算符:&、|和^也可以称为位运算符。逐位运算符逐位比较两个变量,并返回一个变量
根据比较的两个变量是否存在差异,设置了哪些位
同时在&、一个或另一个在|上或正好在&上的相应位
一对一 逻辑运算符:&&、| |、&、|和^只能用于计算两个
布尔表达式
&&和&之间的区别在于&&运算符
如果左操作数的计算结果为false,则不必麻烦测试右操作数,因为
&&表达式的结果永远不可能为真
| |和|之间的区别是
如果左操作数的计算结果为
是的,因为在那一点上已经知道结果是真的
位运算符:&、|和^也可以称为位运算符。逐位运算符逐位比较两个变量,并返回一个变量
根据比较的两个变量是否存在差异,设置了哪些位
同时在&、一个或另一个在|上或正好在&上的相应位
一对一 不,我在找接线员。如果|运算符的优先级高于&,那么&&为什么比|先执行。@VijendraSingh我现在明白你的意思了。我已经编辑了我的答案。@ZongLi您可以演示如何使用parantises解析代码。x++>2&&++y>2 |对。不,我找了|运算符。如果|运算符的优先级高于&,那么&&为什么比|先执行。@VijendraSingh我现在明白你的意思了。我已经编辑了我的答案。@ZongLi您可以演示如何使用parantises解析代码。x++>2&&++y>2 | true。实际上,我故意使用了| oprator,如果|运算符的优先级高于&,那么为什么&&执行的优先级高于&。我不这么认为。您将在逻辑AND的任一侧应用所有按位操作,然后应用逻辑AND。你也得到了一点麻烦-你实际上没有在逻辑块中做任何事情,所以你怎么能绝对确定你没有得到你想要的结果呢?因为如果| evalute早于&,那么y应该有6作为输出。否。您正在对&&短路。右边没有计算。实际上我故意使用了| oprator,如果|运算符的优先级高于&&,那么为什么&&要比|先执行。我不这么认为。您将在逻辑AND的任一侧应用所有按位操作,然后应用逻辑AND。你也得到了一点麻烦-你实际上没有在逻辑块中做任何事情,所以你怎么能绝对确定你没有得到你想要的结果呢?因为如果| evalute早于&,那么y应该有6作为输出。否。您正在对&&短路。右侧未进行评估。