我一直在阅读Linux内核(特别是2.6.11).我发现了以下定义:
#define unlikely(x) __builtin_expect(!!(x), 0)
Run Code Online (Sandbox Code Playgroud)
(来自linux-2.6.11/include/linux/compiler.h:61 lxr链接)
什么!! 完成?为什么不使用(x)?
也可以看看:
Pau*_*lin 30
!!(x)
强制它为0或1. 0保持为0,但任何非零值(在布尔上下文中为'true')变为1.
hha*_*fez 11
它不是一种语言语法,而是将char或int转换为准布尔值的常用简写.
在C逻辑操作中,例如== &&!因为没有布尔类型,所以可以对int,char等进行操作,但是根据标准,它们保证为False返回0,为true返回1.
所以,例如,如果你有
int x = 5;
Run Code Online (Sandbox Code Playgroud)
你可以强制它转换为"布尔"类型(C中没有布尔类型,因此引号)
x = !x; /* !5 which gives 0 always */
x = !x; /* which gives 1 always */
Run Code Online (Sandbox Code Playgroud)
!!(x)
相当于(x) != 0
(除非在C++中正在进行一些非常奇怪的运算符重载).
事实上,不清楚!!(x)
做什么可能是一个很好的理由(x) != 0
.除非你想成为精英内核黑客.
请参阅这个封闭的问题(如果它仍然存在)以讨论优点!!
(也许该问题将被重新打开,因为这个问题表明它有一些价值).