This question already has answers here:
Double Negation in C++

(14个回答)



double negation in C : is it guaranteed to return 0/1?

(2个答案)


3年前关闭。




我从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_expect(herehere)的信息,但我仍然不清楚(!!(x))中的双重 bool 求反运算符的目的是什么。为什么使用它?

有问题的文件是this one

最佳答案

__builtin_expect具有严格的相等性,因此,双重否定的意义在于确保所有真实值都转换为1(并因此与GSL_LIKELY中的1匹配),并且所有伪造的值均与GSL_UNLIKELY中的0匹配。

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

关于c++ - 双 bool 取反运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48840531/

10-11 23:09