2010-09-13 147 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