2008-08-29 89 views
231

我總是在OR表達式中使用||(兩個管道),無論是C#還是PHP。偶爾我會看到使用的單根管道:|。這兩種用法有什麼區別?在使用其他產品時是否有任何注意事項,或者它們是否可以互換?|有什麼區別?和||或運營商?

回答

380

就像&&&操作符一樣,雙操作符是一個「短路」操作符。

例如:

if(condition1 || condition2 || condition3) 

如果條件1爲真,條件2和3將不會檢查。

if(condition1 | condition2 | condition3) 

這將檢查條件2和3,即使1已經爲真。由於你的條件可能是相當昂貴的功能,你可以通過使用它們來獲得很好的性能提升。

有一個很大的警告,NullReferences或類似的問題。例如:

if(class != null && class.someVar < 20) 

如果類爲null,if語句將停止後class != null是假的。如果你只使用&,它會嘗試檢查class.someVar,你會得到一個不錯的NullReferenceException。由於Or運算符可能不是一個陷阱,因爲它不太可能觸發一些不好的事情,但需要牢記。

雖然沒有人使用單個&|運算符,除非您有一個設計,其中每個條件都是要執行的函數。聽起來像是一種設計氣味,但有時(很少)它是一種乾淨的做事方式。 &運算符「運行這3個函數,如果其中一個返回false,執行else塊」,而|「只運行else塊,如果沒有返回false」 - 可能是有用的,但如前所述,通常它是一種設計氣味。

|&運營商的第二次使用,但:Bitwise Operations

+42

不知道爲什麼這是獲得downvoted - 這是正確的!如果你不相信他,請在編譯器中仔細檢查它! – 2008-09-06 08:07:10

+8

是的,我直到我創建了一個控制檯應用程序才相信它 - 但是很好的領主!他們爲什麼會給你繩索掛上你自己!我討厭VB.NET - OrElse和AndAlso關鍵字! – 2008-09-06 08:09:52

26

一個是「按位或」。

10011b | 01000b => 11011b

另一種是邏輯或。

true or false => true

0

的燒毛管道 「|」是「按位」還是隻能在知道自己在做什麼時才使用。雙管「||」是邏輯或,並且可以在邏輯語句中使用,如「x == 0 || x == 1」。下面是一個按位或者做什麼的例子:如果a = 0101和b = 0011,那麼a | b = 0111。如果您正在處理將任何非零值視爲true的邏輯系統,那麼按位或將按照與邏輯或的方式相同的方式進行操作,但它是對等的(按位和「&」)將不會。也按位或不執行短路評估。

-1

單個管道(|)是bitwise OR operator

兩個管道(||)是邏輯OR運算符。

它們不可互換。

+0

如果忽略按位運算,則在邏輯運算符區域內,雙管道是惰性評估,單管道是貪婪的。 – Alex 2013-10-31 15:43:31

-1

|| (兩管)通常是邏輯或者同時| (一個管道)是二進制或。除了我的頭頂,我想不出任何時候這個差異會成爲一個大問題(除了將結果分配給其他人時)。不過,我確定別人會有一個重要的情況。

編輯:哇,在我寫這篇文章的時候,還有其他六個答案。

66

||是邏輯OR運算符。這聽起來像你基本上知道那是什麼。它用於條件語句,如if,while等。

condition1 || condition2 

如果條件1或條件2爲真,則計算結果爲true。

|是按位或運算符。它用於對兩個數字進行操作。您可以分別查看每個數字的每一位,如果其中至少一個數字中有一位是1,則結果位也是1。這裏有幾個例子:

A = 01010101 
B = 10101010 
A | B = 11111111 

A = 00000001 
B = 00010000 
A | B = 00010001 

A = 10001011 
B = 00101100 

A | B = 10101111 

希望這是有道理的。

所以要回答最後兩個問題,除了「知道兩個操作員之間的區別」之外,我不會說有任何警告。他們不可互換,因爲他們做了兩件完全不同的事情。

10

好問題。這兩個運算符在PHP和C#中的工作方式相同。

|是一個按位或。它會按比特比較兩個值。例如。 1101 | 0010 = 1111.這在使用位選項時非常有用。例如。讀取= 01(0X01)寫入= 10(0X02)讀取寫入= 11(0X03)。一個有用的例子是打開文件。一個簡單的例子是:

File.Open(FileAccess.Read | FileAccess.Write); //Gives read/write access to the file 

||是一個邏輯或。這是大多數人認爲OR的方式,並根據他們的真實情況比較兩個值。例如。我要去商店,否則我會去商場。這是代碼中經常使用的一種。例如。

if(Name == "Admin" || Name == "Developer) { //allow access } //checks if name equals Admin OR Name equals Developer 

PHP資源:http://us3.php.net/language.operators.bitwise

C#的資源​​:http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

1

單管,|,是bitwise運營商之一。

維基百科:

在C程序設計語言的家庭,按位或運算符是 「|」 (管)。同樣,這個操作符不能與它的布爾邏輯或對應物相混淆,它將操作數當作布爾值處理,並寫成「||」 (兩根管子)。

-1

按位(|)與邏輯(||)! 將邏輯看作Java中的Comparable對象,比較一些可區分的「部分」,而按位運算符查看這些對象,而不是查看它們是否是可視化的雙胞胎(如邏輯),做DNA樣本並查看0和1代替。在Java中

3

簡單的例子

public class Driver { 

    static int x; 
    static int y; 

public static void main(String[] args) 
throws Exception { 

System.out.println("using double pipe"); 
    if(setX() || setY()) 
     {System.out.println("x = "+x); 
     System.out.println("y = "+y); 
     } 



System.out.println("using single pipe"); 
if(setX() | setY()) 
    {System.out.println("x = "+x); 
    System.out.println("y = "+y); 
    } 

} 

static boolean setX(){ 
     x=5; 
    return true; 
    } 
static boolean setY(){ 
     y=5; 
     return true; 
    } 
} 

輸出:

using double pipe 
x = 5 
y = 0 
using single pipe 
x = 5 
y = 5 
0

通過他們的數學定義,OR和AND是二元操作;無論如何,他們都會驗證LHS和RHS條件,類似於|和&。

||和& &通過在LHS條件未滿足時停止它們來更改OR和AND運算符的屬性。

1

& - (條件1個&條件2):檢查這兩種情況下,即使第一個是假

& & - (條件1 & &條件2):這麼想的打擾如果情況下,一個檢查第二殼體 是假

& & - 運營商將會使你的代碼運行速度更快,專業&很少使用

| - (條件1 |條件2):檢查這兩種情況下,即使案件1爲真

|| - (條件1個||條件2):這麼想的麻煩,以檢查第二情況下,如果第一 之一爲真

|| - 運營商將使你的代碼更快,更專業|很少使用