双布尔否定运算符

Nic*_*ick 5 c c++ macros negation

我从Microsoft的GSL实现(C++指南支持库)中看到了这段代码:

#if defined(__clang__) || defined(__GNUC__)
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define GSL_LIKELY(x) (!!(x))
#define GSL_UNLIKELY(x) (!!(x))
#endif
Run Code Online (Sandbox Code Playgroud)

我读到了__builtin_expect(这里这里),但我仍然不清楚双boolean否定运算符的目的是什么(!!(x)).为什么用它?

有问题的文件就是这个.

Mat*_*lia 6

__builtin_expect在严格相等的情况下工作,所以这里的双重否定点是确保所有的真值都转换为1(从而匹配1 GSL_LIKELY),并且所有的虚假值都匹配0 in GSL_UNLIKELY.

即使__builtin_expect无法保持一致性,也可以保持双重否定(因为调用者可以将其他用途的返回值存储起来除了作为条件if).