在閱讀一個代碼,我讀:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我沒有得到什麼意思!!
這裏。 這句話做了什麼?
編輯:
我得到了它的一個雙重負。將非bool數據轉換爲bool的技巧
但是,那需要什麼?這裏flush是布爾然後如果你分配任何非零項布爾它將視爲1和零項爲0,所以這樣做有什麼好處?
在閱讀一個代碼,我讀:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我沒有得到什麼意思!!
這裏。 這句話做了什麼?
編輯:
我得到了它的一個雙重負。將非bool數據轉換爲bool的技巧
但是,那需要什麼?這裏flush是布爾然後如果你分配任何非零項布爾它將視爲1和零項爲0,所以這樣做有什麼好處?
這是一個雙重否定的。這是將其他非非布爾表達式(例如flags & GST_SEEK_FLAG_FLUSH
)轉換爲bool
的一種方法。我個人比較喜歡:
flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;
只想添加你可能清楚的事情一個小例子。
main()
{
int i=10;
printf("%d",!!i);
}
輸出爲1
如果flush
是布爾變量,你迫使一些非布爾值給它,一些編譯器會生成一個警告強制值bool「真」或「假」 。所以使用雙重否定更安全。
一些編譯器(如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
檢查。
也許有人把邏輯NOT('!`)與位按NOT(`〜`)混淆了? – 2011-12-15 06:02:50
但什麼需要? 這裏flush是布爾然後如果你分配任何非零項布爾它將視爲1和零iteam爲0所以這樣做有什麼好處? – 2011-12-15 06:22:34
@ Mr.32它用於檢查`flags`變量中是否設置了'GST_SEEK_FLAGS_FLUSH`位。 – 2011-12-15 06:30:40