2010-09-05 49 views

回答

11

|是一個位OR運營商,其中爲||是一個邏輯運算符OR。也就是說,前者用於將來自兩個數值的比特「合併」爲一個聯合,而後者則在運算符左側或右側的任一條件爲真時評估爲真。

具體而言,按位運算符(而不是與邏輯運算符混淆)對數字的每一位(在相同的序數位置)進行操作,並相應地計算結果。在逐位OR的情況下,所得到的位爲1,如果任一比特爲1,且0僅當兩個位都爲0。例如,1 | 2 = 3,這是因爲:

1 = 0001 
2 = 0010 
-------- 
    0011 = 3 

此外,2 | 3 = 3,因爲:

2 = 0010 
3 = 0011 
-------- 
    0011 = 3 

這看起來可能會讓人困惑,但最終你會得到它的竅門。 Bitwise OR主要用於在位域上設置標誌的情況。也就是說,一個值將一組相關條件的開/關狀態保存在單個值(通常是32位數字)中。在Win32中,窗口樣式值是位字段的一個很好的例子,每個樣式都由一個位(或標誌)表示,如WS_CAPTION,它指示窗口是否有標題欄。

3

單詞中有幾個(通常是32,16,8或64)位。按位OR(一個垂直條)爲該位位置中的每個位置返回邏輯或。邏輯OR(兩個垂直條)只返回TRUE或FALSE。

0

該||是一個邏輯或和|是一個按位或。大多數情況下,當你檢查if(i == 0 || i == 1)時,你只是想使用||但是當你正在做象傳遞標誌這樣的變量時使用|。 (如果你不知道那是什麼,你可能不需要|在所有)

2

正如其他人提及的,|按位 OR運算並||邏輯 OR運算符,以及它們在概念上不同的操作上不同種類的輸入,(通常)操作。但是,這可能會引發另一個問題:如果您將|與布爾操作數一起使用,那麼它會不會與||做同樣的事情,因爲一切最終都會歸結爲位?是否需要獨特的||操作員?

除了概念上的差異,另一個重要的區別是||短路。這意味着如果第一個操作數爲真,則第二個操作數根本就不被計算。例如:

int flag = Foo() || Bar(); 

將調用Bar()只有Foo()返回0。如果|使用,兩個操作數總是會進行評估。

(而且,當然,&&&有類似的行爲。)

+0

+1希望我能夠投票這件事不止一次。非常重要的一點! – 2011-05-01 20:21:52