+ -
当前位置:首页 → 问答吧 → 请教 表达式 !!(x) 和 (x)有什么差别吗?

请教 表达式 !!(x) 和 (x)有什么差别吗?

时间:2010-11-24

来源:互联网

请教 表达式  !!(x) 和 (x)有什么差别吗?
比如下面这个宏
#  define likely(x)     (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))

!!(x) 和 x 不是相等的吗?

作者: Linux386   发布时间: 2010-11-24

类型不一样.

作者: smalloc   发布时间: 2010-11-24

如果x不为0,!!(x)可以把x变成1

作者: 论坛ID   发布时间: 2010-11-24

本帖最后由 论坛ID 于 2010-11-24 13:55 编辑

这个问题在《professional linux kernel architecture》里面有讨论,在1199页。
  1. #define likely(x) __builtin_expect(!!(x), 1)
  2. #define unlikely(x) __builtin_expect(!!(x), 0)
  3. The double negation !! is used for two reasons:
  4. ❑ It enables the macros to be used with pointers that are implicitly converted into a truth value.
  5. ❑ Truth values greater than zero (explicitly allowed in C) are standardized to 1 as expected by __builtin_expect.
复制代码

作者: 论坛ID   发布时间: 2010-11-24

2 楼正解。

其实这样的问题,完全可以自己先实验一下。
x = 100,看一下这两个表达式执行结果是什么。

作者: Godbach   发布时间: 2010-11-24

回复 论坛ID


    非常感谢!了解了

作者: Linux386   发布时间: 2010-11-24