2011-12-15 91 views
1

可能重複:
Double Negation in C++ code什麼是!!的意義!在C - 爲什麼它需要?

在閱讀一個代碼,我讀:

flush = ! !(flags & GST_SEEK_FLAG_FLUSH); 

我沒有得到什麼意思!!這裏。 這句話做了什麼?

編輯:

我得到了它的一個雙重負。將非bool數據轉換爲bool的技巧

但是,那需要什麼?這裏flush是布爾然後如果你分配任何非零項布爾它將視爲1和零項爲0,所以這樣做有什麼好處?

+0

也許有人把邏輯NOT('!`)與位按NOT(`〜`)混淆了? – 2011-12-15 06:02:50

+0

但什麼需要? 這裏flush是布爾然後如果你分配任何非零項布爾它將視爲1和零iteam爲0所以這樣做有什麼好處? – 2011-12-15 06:22:34

+0

@ Mr.32它用於檢查`flags`變量中是否設置了'GST_SEEK_FLAGS_FLUSH`位。 – 2011-12-15 06:30:40

回答

9

這是一個雙重否定的。這是將其他非非布爾表達式(例如flags & GST_SEEK_FLAG_FLUSH)轉換爲bool的一種方法。我個人比較喜歡:

flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;

2

只想添加你可能清楚的事情一個小例子。

main() 
{ 
int i=10; 
printf("%d",!!i); 
} 

輸出爲1

2

如果flush是布爾變量,你迫使一些非布爾值給它,一些編譯器會生成一個警告強制值bool「真」或「假」 。所以使用雙重否定更安全。

2

一些編譯器(如Visual Studio)脅迫非布爾類型爲int時會發出警告,例如:

#include <stdio.h> 

int main(void) { 
    int x = 10; 
    bool y = x; // warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) 
    return 0; 
} 

的雙否定訣竅是轉換爲bool和防止此警告的一種方式,但我會傾向於爲了清晰起見,Jim Buck建議的!= 0檢查。

相關問題