1

可能重复:
C++ 代码中的双重否定

在阅读一段代码时,我读到:

flush = ! !(flags & GST_SEEK_FLAG_FLUSH);

我不明白!!这里的意思。这句话是做什么的?

编辑:

我知道它是双重否定的。将非布尔数据转换为布尔数据的技巧

但那有什么需要呢?这里 flush 是 bool 那么如果你将任何非零项分配给 bool 它将被视为 1 而零项被视为 0 那么这样做有什么好处呢?

4

4 回答 4

9

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

flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;

于 2011-12-15T06:01:41.000 回答
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 并防止此警告的一种方法,但是为了清楚起见,我倾向于使用!= 0Jim Buck 推荐的检查。

于 2011-12-15T06:35:37.630 回答
2

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

于 2011-12-15T06:33:06.647 回答
2

只是想为您添加一个可能会清除问题的小示例。

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

输出为 1

于 2011-12-15T06:15:55.763 回答