!!(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
一个很好的理由。 除非你想成为精英内核黑客。
看到这个封闭的问题 (如果它仍然存在),讨论优点 !!
(也许这个问题将被重新开放,因为这个问题表明它有一些价值)。