经常看到判断语句前面有加likely(x),知道这是告诉编译器,这个判断语句很可能为“真”,这样有利于提高程序运行速度。
但是从来没有跟进去看下,跟进去之后看到
likely(x) __builtin_expect(!!(x), 1)
__builtin_expect (exp, c)是gcc编译器的编译指令,告诉编译器,exp==c 很可能成立
但是!!(x)又是什么意思呢?
原来!!(x) 是将x转换为bool类型, 0为 0 ,非0为1。
这样就相当于告诉编译器x判断是为真很可能成立。
如果没有加!!,那么只是告诉编译器x语句执行结果等于1很可能成立而已。
那么如果x是负数呢?
有了这个疑惑于是写了一个程序验证
#include <stdio.h>
int main()
{
int x = -3;
printf("!!x = %d\n", !!(x));
return 0;
}
输出结果为
!!x = 1
证明和if语句一样,非0即为真,负数也为真。