2011-12-30 94 views
5

爲什麼第一個能夠正確增加pbf_ [k],而第二個甚至不會(增加)一次?這兩個C++代碼塊有什麼區別?

unsigned pbf_[5] ={0}; 
bool m=0; 

代碼1:

for(int k=0;k<5;k++)  
{ 

    if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true)  
    pbf_[k]++; 
    } 

代碼2:

for(int k=0;k<5;k++)  
{ 
    if((bit_table_[k][i][bit_index ] & bit_mask[bit])==true) 
     pbf_[k]++; 
} 
+0

那麼你應該檢查每個迭代內的M值以及它們之後,你應該看到差異... – 2011-12-30 09:59:12

回答

7

在第一種情況下,掩蔽結果在與真實值比較之前轉換爲bool m

在第二種情況下,我相信位掩碼是一些整數類型。在這種情況下,true將被提升爲相同的整數類型(並且值爲1)。

只需從比較中刪除== true即可使其相同。

+3

如果@John沒有意識到,'&'是按位AND,而不是邏輯AND,所以結果是一個整數。在布爾上下文中計算的非零整數爲真,但它不等於「true」的值,作爲整數*,爲1。 – 2011-12-30 10:04:26

+0

解決此問題的另一種方法是對「bool」使用明確的轉換。然而,這很愚蠢,因爲與「真」相比,首先是愚蠢的。就像「這是真的」這個詞在英語中幾乎總是多餘的一樣,'== true'在編程中幾乎總是多餘的。 – 2011-12-30 10:17:45

0

在第一測試分配給的bit_table_[k][i][bit_index ] & bit_mask[bit]值的米的結果,而第二剛測試是否

bit_table_[k][i][bit_index ] & bit_mask[bit]結果不是0

兩者的效果都是一樣的,只是第一次在每次迭代中記錄結果爲m。

+1

不,它們不具有相同的效果,我相信您對第二個測試的描述不正確。見波佩爾鬆的答案。 – Mat 2011-12-30 10:10:53

0

您首先檢查

if((m=(bit_table_[k][i][bit_index ] &bit_mask[bit]))==true) 

是assining一定的參考價值變量m,如果爲真時所採取的。

0

我在代碼中發現了一個問題。您需要使用& &而不是&。 比較而言,& &是一個邏輯運算符,它不同於& - 雙向運算符。

實施例:

如果((M =(bit_table_ [K] [I] [bit_index] & & BIT_MASK [比特]))== TRUE)

要了解操作員在C++中可以請訪問:http://www.worldbestlearningcenter.com/index_files/c++_operators.htm

+0

不,他確實需要一個按位運算符,因爲他需要檢查兩個值中是否設置了特定的位。然而,他需要**而不是**將結果與'true'進行比較,因爲這相當於將其與'1'進行比較,即使在「匹配」時它可能還有其他非零值。 @BoPersson是對的。 – 2011-12-30 10:16:09