在阅读我读过的一个代码时:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我没有得到!!
这里的含义。
这句话是做什么的?
修改
我得到了一个双重否定。技巧,将非bool数据转换为bool
但是有什么需要呢?这里的冲洗是bool然后如果你将任何非零项目分配给bool它会将1和零项目视为0,所以这样做有什么好处? / p>
答案 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
检查。