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