在阅读一个代码,我读:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我没有得到什么意思!!
这里。 这句话做了什么?
编辑:
我得到了它的一个双重负。将非bool数据转换为bool的技巧
但是,那需要什么?这里flush是布尔然后如果你分配任何非零项布尔它将视为1和零项为0,所以这样做有什么好处?
在阅读一个代码,我读:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
我没有得到什么意思!!
这里。 这句话做了什么?
编辑:
我得到了它的一个双重负。将非bool数据转换为bool的技巧
但是,那需要什么?这里flush是布尔然后如果你分配任何非零项布尔它将视为1和零项为0,所以这样做有什么好处?
这是一个双重否定的。这是将其他非非布尔表达式(例如flags & GST_SEEK_FLAG_FLUSH
)转换为bool
的一种方法。我个人比较喜欢:
flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;
只想添加你可能清楚的事情一个小例子。
main()
{
int i=10;
printf("%d",!!i);
}
输出为1
如果flush
是布尔变量,你迫使一些非布尔值给它,一些编译器会生成一个警告强制值bool“真”或“假” 。所以使用双重否定更安全。
一些编译器(如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
检查。
也许有人把逻辑NOT('!`)与位按NOT(`〜`)混淆了? – 2011-12-15 06:02:50
但什么需要? 这里flush是布尔然后如果你分配任何非零项布尔它将视为1和零iteam为0所以这样做有什么好处? – 2011-12-15 06:22:34
@ Mr.32它用于检查`flags`变量中是否设置了'GST_SEEK_FLAGS_FLUSH`位。 – 2011-12-15 06:30:40