我總是在OR表達式中使用||
(兩個管道),無論是C#還是PHP。偶爾我會看到使用的單根管道:|
。這兩種用法有什麼區別?在使用其他產品時是否有任何注意事項,或者它們是否可以互換?|有什麼區別?和||或運營商?
回答
就像&
和&&
操作符一樣,雙操作符是一個「短路」操作符。
例如:
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。
一個是「按位或」。
10011b | 01000b => 11011b
另一種是邏輯或。
true or false => true
The |運算符對其兩個操作數執行按位或運算(意味着雙方必須計算爲false,以使其返回false),而||運營商只會在需要時評估第二個運營商。
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
如果您實際閱讀這些文章,您會發現它們指的是按位運算符 – johnc 2009-03-02 03:01:21
的燒毛管道 「|」是「按位」還是隻能在知道自己在做什麼時才使用。雙管「||」是邏輯或,並且可以在邏輯語句中使用,如「x == 0 || x == 1」。下面是一個按位或者做什麼的例子:如果a = 0101和b = 0011,那麼a | b = 0111。如果您正在處理將任何非零值視爲true的邏輯系統,那麼按位或將按照與邏輯或的方式相同的方式進行操作,但它是對等的(按位和「&」)將不會。也按位或不執行短路評估。
如果忽略按位運算,則在邏輯運算符區域內,雙管道是惰性評估,單管道是貪婪的。 – Alex 2013-10-31 15:43:31
|| (兩管)通常是邏輯或者同時| (一個管道)是二進制或。除了我的頭頂,我想不出任何時候這個差異會成爲一個大問題(除了將結果分配給其他人時)。不過,我確定別人會有一個重要的情況。
編輯:哇,在我寫這篇文章的時候,還有其他六個答案。
||是邏輯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
希望這是有道理的。
所以要回答最後兩個問題,除了「知道兩個操作員之間的區別」之外,我不會說有任何警告。他們不可互換,因爲他們做了兩件完全不同的事情。
好問題。這兩個運算符在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
單管,|,是bitwise運營商之一。
維基百科:
在C程序設計語言的家庭,按位或運算符是 「|」 (管)。同樣,這個操作符不能與它的布爾邏輯或對應物相混淆,它將操作數當作布爾值處理,並寫成「||」 (兩根管子)。
按位(|)與邏輯(||)! 將邏輯看作Java中的Comparable對象,比較一些可區分的「部分」,而按位運算符查看這些對象,而不是查看它們是否是可視化的雙胞胎(如邏輯),做DNA樣本並查看0和1代替。在Java中
簡單的例子
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
通過他們的數學定義,OR和AND是二元操作;無論如何,他們都會驗證LHS和RHS條件,類似於|和&。
||和& &通過在LHS條件未滿足時停止它們來更改OR和AND運算符的屬性。
& - (條件1個&條件2):檢查這兩種情況下,即使第一個是假
& & - (條件1 & &條件2):這麼想的打擾如果情況下,一個檢查第二殼體 是假
& & - 運營商將會使你的代碼運行速度更快,專業&很少使用
| - (條件1 |條件2):檢查這兩種情況下,即使案件1爲真
|| - (條件1個||條件2):這麼想的麻煩,以檢查第二情況下,如果第一 之一爲真
|| - 運營商將使你的代碼更快,更專業|很少使用
- 1. Php:|有什麼區別?和||運營商
- 2. 〜和!有什麼區別?運營商?
- 3. rxjs 5中發佈和多播運營商有什麼區別?
- 4. 全球運營商和會員運營商之間的區別
- 5. 是什麼Perl的(或和)和(||,&&)短路運營商之間的區別?
- 6. Boost.Spirit:運營商之間的區別「%=」和「=」
- 7. 運營商之間的區別+ =和= +
- 8. |之間的區別和>運營商
- 9. 什麼〜運營商
- 10. 是什麼SIM運營商和網絡運營商
- 11. 什麼是按位或|運營商呢?
- 12. 或運營商與三元運營商
- 13. Golang運營商的區別:= VS =
- 14. grepping柱(和|或)運營商
- 15. 什麼是「|」運營商呢?
- 16. C#什麼是'?'運營商
- 17. ||是什麼運營商呢?
- 18. 什麼|運營商呢?
- 19. 運營商做什麼?
- 20. 什麼是!運營商呢?
- 21. ?的含義是什麼?和??運營商
- 22. 空 - 結合運營商和運營商&&
- 23. RegEx - 或運營商
- 24. &&和||運營商
- 25. vb.net結合和或或運營商
- 26. 什麼是「===!」運營商在做什
- 27. rebar和rebar3有什麼區別?或erlang.mk
- 28. Postcss和grunt或gulp有什麼區別?
- 29. 指數和非,或,和運營商
- 30. NSPredicate中ALL,ANY和SOME運營商之間的區別
不知道爲什麼這是獲得downvoted - 這是正確的!如果你不相信他,請在編譯器中仔細檢查它! – 2008-09-06 08:07:10
是的,我直到我創建了一個控制檯應用程序才相信它 - 但是很好的領主!他們爲什麼會給你繩索掛上你自己!我討厭VB.NET - OrElse和AndAlso關鍵字! – 2008-09-06 08:09:52