!!(x)在C(特别是Linux内核)中的含义是什么?

我一直在阅读Linux内核(特别是2.6.11)。 我遇到了以下定义:

#define unlikely(x) __builtin_expect(!!(x), 0) 

(来自linux-2.6.11 / include / linux / compiler.h:61 lxr链接 )

什么!! 完成? 为什么不使用(x)?

也可以看看:

  • 逻辑否定如何在C中起作用?
  • C ++代码中的双重否定。

!!(x)强制它为0或1. 0保持为0,但任何非零值(在布尔上下文中为’true’)变为1。

它不是一种语言语法,而是将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 */ 

!!(x)相当于(x) != 0 (除非在C ++中进行一些非常奇怪的运算符重载)。

事实上, !!(x)正在做的事情并不明显,这可能是使用(x) != 0一个很好的理由。 除非你想成为精英内核黑客。

看到这个封闭的问题 (如果它仍然存在),讨论优点!! (也许这个问题将被重新开放,因为这个问题表明它有一些价值)。