2010-09-13 114 views
16

没有人知道为什么:逻辑OR运算符VS位或运算符

if (false && true || true) { 
     System.out.println("True"); 
} else { 
     System.out.println("False"); 
} 

打印 “

if (false && true | true) { 
      System.out.println("True"); 
    } else { 
      System.out.println("False"); 
    } 

+4

科林在这里得到了一个正确的答案,这个答案像疯了一样沮丧。我不想要相同的命运,所以我会将它作为评论发布:&和|在一个布尔上下文中不是按位运算符,而是渴望的布尔运算符(没有短路,双方都将被评估)。看到这个:http://en.wikipedia.org/wiki/Short-circuit_evaluation#Support_in_common_programming_languages – 2010-09-13 08:31:24

+1

但奇怪的是,我无法找到任何太阳官方文件在哪里|和&被引用为逻辑运算符(但它是SCJP6考试的一部分) – 2010-09-13 08:35:49

+0

@seanizer:这里仍然有一个正确的答案。 (实际上其中两个):-)无论它们是否按位进行布尔运算都不是真正的重点*这里*,无论如何,“|”都是更高的优先级,这就是为什么OP会看到他/她在问。 – 2010-09-13 08:57:48

回答

16

由于operator precedence的打印。在您的第一个示例中,首先完成&&,然后再完成||。但是按位OR具有更高的优先级,因此在第二个示例中,首先完成|,然后执行&&

+4

downvoter会提供一些有用的反馈吗? – 2010-09-13 11:43:59

20

在第一种情况下,& &具有比||更高的优先级。运算符,因此表达式的计算结果为if ((false && true) || true),您将得到True。

在第二种情况下,按位OR运算符的优先级高于& &,因此表达式的求值为if (false && (true | true)),您将得到False。

+0

在这种情况下,它不是一个按位运算符。整个表达式if(false &&(true | true))将被评估。想要一些证据(两种说法)? – 2010-09-13 10:37:49

+1

@Pawel:在OP的问题中,无论是否按位都不重要。 '|'仍然优先于'&&',所以第一个操作是'true | true“,它是'true',然后输入'false && true',这当然是'false'。整个“|”在应用于布尔运算符时是否按位进行处理在任何情况下都是非常重要的,并且在任何情况下都是语义上的(一个按位逻辑运算符仅应用于一个位 - 这就是概念上的布尔逻辑) ...逻辑运算符!)。 :-) – 2010-09-13 10:53:01

+0

&&和&在布尔上下文中都是按位和逻辑的,但&&的优先级高于&(或|) – 2010-09-13 11:38:06