双布尔否定运算符

时间:2018-02-17 10:54:01

标签: c++ c macros negation

我从Microsoft implementation of 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

我读到了__builtin_expectherehere),但我仍不清楚(!!(x))中双布尔否定运算符的用途是什么。为什么使用它?

有问题的文件是this one

1 个答案:

答案 0 :(得分:6)

def Delete(self,test1): client=MongoClient('localhost',27017) db=client.test collection=db.test1 db.test1.remove({"_id": ObjectId("5a880803afe40825990e7255")}) 使用严格相等,所以这里的双重否定点是确保所有的真值都转换为1(从而匹配__builtin_expect中的1),以及所有的虚假值匹配GSL_LIKELY中的0。

即使GSL_UNLIKELY无法保持一致性,也会保留双重否定(因为调用者可能会将其他用途的返回值存储为__builtin_expect中的条件)。