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

Wil*_*hin 23 c gcc

我一直在阅读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.

  • 在这种情况下真的没有必要,因为我们期望结果为0.实际上只需要`#define possible(x)__builtin_expect(!!(x),1)`来确保true为1.它可能只是包含在"不太可能"的对称性定义中. (6认同)

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)


Mic*_*urr 8

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

事实上,不清楚!!(x)做什么可能是一个很好的理由(x) != 0.除非你想成为精英内核黑客.

请参阅这个封闭的问题(如果它仍然存在)以讨论优点!!(也许该问题将被重新打开,因为这个问题表明它有一些价值).

  • 第一次看到它时,"!!(x)"会做半秒钟的"不明显".看到它后,或者a)考虑一下或b)问别人,你会认识到`!!`"运算符"很快就会发生什么. (3认同)
  • @Chris - 如果它是你店里常见的习语,可以使用它.另一方面,我偶然遇到`!!(x)`,我不得不暂停一会儿.关于`(x)!= 0`的意思,我不必密码.这不是什么大不了的事,但我认为很少推荐`!!(x)`over`(x)!= 0`. (3认同)