2011-12-15 81 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检查。

相关问题