可能重复:
C++ 代码中的双重否定
在阅读一段代码时,我读到:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我不明白!!
这里的意思。这句话是做什么的?
编辑:
我知道它是双重否定的。将非布尔数据转换为布尔数据的技巧
但那有什么需要呢?这里 flush 是 bool 那么如果你将任何非零项分配给 bool 它将被视为 1 而零项被视为 0 那么这样做有什么好处呢?
可能重复:
C++ 代码中的双重否定
在阅读一段代码时,我读到:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我不明白!!
这里的意思。这句话是做什么的?
编辑:
我知道它是双重否定的。将非布尔数据转换为布尔数据的技巧
但那有什么需要呢?这里 flush 是 bool 那么如果你将任何非零项分配给 bool 它将被视为 1 而零项被视为 0 那么这样做有什么好处呢?
这是一个双重否定。这是一种将非布尔表达式(例如flags & GST_SEEK_FLAG_FLUSH
)转换为bool
. 我个人更喜欢:
flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;
一些编译器(如 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 并防止此警告的一种方法,但是为了清楚起见,我倾向于使用!= 0
Jim Buck 推荐的检查。
如果flush
是布尔变量,并且您对其强制使用一些非布尔值,则某些编译器将生成警告强制值为 bool 'true' 或 'false'。所以使用双重否定更安全。
只是想为您添加一个可能会清除问题的小示例。
main()
{
int i=10;
printf("%d",!!i);
}
输出为 1