Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 逻辑运算符优先级_Java - Fatal编程技术网

Java 逻辑运算符优先级

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++首先进行计算 甚至我在|周围的条件中

通过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++首先进行计算

甚至我在|周围的条件中加了括号

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作为输出。否。您正在对&&短路。右侧未进行评估。