双重布尔否定运算符

5
我发现了一段代码,来自于微软的GSL实现(C++指南支持库):

Microsoft implementation of GSL

#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

我了解到__builtin_expect的相关信息(在这里这里),但是我仍然不清楚在(!!(x))中为什么要使用双重布尔否定运算符。它的目的是什么?
涉及的文件是这个文件

1
@dhke 这个答案可以适用于C++。在C++中,operator!返回一个布尔值。 - Oliv
为什么这个问题被标记为C,而上下文是一个严格的C++库? - Jonathan Leffler
1个回答

6
__builtin_expect 与严格相等配合使用,所以这里的双重否定的作用是确保所有真值都被转换为 1(因此匹配 GSL_LIKELY 中的 1),而所有假值都匹配 GSL_UNLIKELY 中的 0。即使没有可用的__builtin_expect,双重否定也会保留以保持一致性(因为调用者可能会将返回值存储为除了作为if条件之外的其他用途)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接