2013-03-25 14 views
1

我想知道什麼diffrence之間:比較常量時,我​​可以在哪裏使用&和==?有什麼不同?

file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY

和:

file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY

當我使用的第一個我得到更多的文件。

FILE_ATTRIBUTE_DIRECTORY是文件屬性常量,file.dwFileAttributes是windows API中的WIN32_FIND_DATA結構成員。

+1

第一個檢查是否在'dwFileAttributes'中設置了特定位,另一個檢查是否設置了該特定位而沒有設置其他位。 – 2013-03-25 19:22:45

+0

你知道二進制數字是什麼位嗎? – hyde 2013-03-25 19:26:40

回答

3

規則很簡單:

  • 當變量可以容納一個值,你等於運算符,==測試。
  • 當變量可以保存零個或一個或多個標誌時,可以使用按位和運算符&測試是否存在標誌。

dwFileAttributes的情況下,該文件說:

文件的文件屬性。有關可能的值及其說明,請參閱...

使用複數表示適用我的第二個要點。

+0

除非保證各個標誌都是唯一的不同的位,否則正確的測試是'if((value&flag)== flag)',如果該值被編碼爲一組位域,那麼'if (值&掩碼)==標誌)'其中'掩碼'匹配整個字段。由於我們討論的是Win32 API,所以'if(value&flag)'的快捷方式不正確的一個典型例子就是窗口樣式。一個具體的例子是'if(style&WS_CAPTION)'不能區分窗口是否有標題欄。 – 2017-04-17 00:04:44

1

file.dwFileAttributes是被用作標誌的整數類型。每一位代表一個標誌(0或1表示設置或未設置)

FILE_ATTRIBUTE_DIRECTORY是一個設置了單個位的整數。 (該位表示文件是否是目錄)

file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY如果設置了FILE_ATTRIBUTE_DIRECTORY標誌,則返回非零值。

file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY如果設置的唯一標誌是FILE_ATTRIBUTE_DIRECTORY,則返回true。

+0

如果OP不清楚:在C中,整數值0表示假,其他任何整數表示爲真。這就是爲什麼在條件下直接使用&運算符的結果。而且,實際上==也給出了一個整數,0或1. – hyde 2013-03-25 19:30:56

2

&是按位操作,而==是實際比較。

位與

#define FLAG_1 1 
#define FLAG_2 2 
#define FLAG_3 4 
#define FLAG_4 8 

/* Check if FLAG_2 or FLAG_3 is enabled in flags */ 
if ((flags & FLAG_2) || (flags & FLAG_3)) { 
    ... 
} 

的大量資源的大約位與和其他基本的位操作。 Wiki link

定期比較

#define FLAG_1 1 
#define FLAG_2 2 
#define FLAG_3 4 
#define FLAG_4 8 

/* Check if flags is *equal* to FLAG_2 value */ 
if (flags == FLAG_2) { 
    ... 
} 
+1

'&'不是任何一種比較。它產生一個整數值;使用它作爲條件將測試該值爲零或非零。 – 2013-03-25 19:30:18

+0

謝謝,更新。我正在準備更長,更具描述性的答案。我想我會讓它變得更好,所以不要這麼快地判斷。 – 2013-03-25 19:34:48

相關問題