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

时间:2010-03-26 22:08:48

标签: c gcc

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

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

(来自linux-2.6.11 / include / linux / compiler.h:61 lxr link

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

  

另见:

     

3 个答案:

答案 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(如果它仍然存在)(可能会重新打开该问题,因为这个问题表明它有一些价值)。