我一直在阅读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)?
也可以看看:
我看到一篇文章提到了!0的结果是依赖于编译器的.结果可以是1或FF或FFFF,依此类推.
至于C99标准6.5.3.3一元算术运算符,
逻辑否定运算符的结果!如果其操作数的值比较不等于0则为0;如果其操作数的值比较等于0则为1.结果的类型为int.表达式!E等价于(0 == E).
它真的是编译器依赖的吗?
我有
int x = 5;
printf("%d", x); //i get 5... expected
x = !x;
printf("%d", x);// i get 0... hmm
Run Code Online (Sandbox Code Playgroud)
二进制5是:0101如果我们对每个位应用反转,我们应该得到1010,但!不一定是反相器,它是一个逻辑运算符.为什么我会得到一个0?
是这样的原因,在C中,正数被视为真,所以!它会导致0?这个编译器具体吗?
#include <stdio.h>
int main()
{
int i;
i=1;
printf("%d ",!i);
i=5;
printf("%d ",!i);
i=0;
printf("%d\n",!i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在C中得到以下输出: 0 0 1
输出背后的逻辑是什么?