什么意思!!在C - 为什么需要它?

时间:2011-12-15 05:59:53

标签: c equation not-operator

  

可能重复:
  Double Negation in C++ code

在阅读我读过的一个代码时:

flush = ! !(flags & GST_SEEK_FLAG_FLUSH);

我没有得到!!这里的含义。 这句话是做什么的?

修改

我得到了一个双重否定。技巧,将非bool数据转换为bool

但是有什么需要呢?这里的冲洗是bool然后如果你将任何非零项目分配给bool它会将1和零项目视为0,所以这样做有什么好处? / p>

4 个答案:

答案 0 :(得分:9)

这是一个双重否定。这是一种将非bool表达式(例如flags & GST_SEEK_FLAG_FLUSH)转换为bool的方法。我个人更喜欢:

flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;

答案 1 :(得分:2)

只是想为你添加一个可以清除事物的小例子。

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

输出为1

答案 2 :(得分:2)

如果flush是布尔变量,并且您强制使用某个非布尔值,则某些编译器会生成警告强制值为bool'true'或'false'。所以使用双重否定更安全。

答案 3 :(得分: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检查。