双布尔否定运算符
双布尔否定运算符
我在Microsoft的GSL实现(C++指南支持库)中发现了这段代码:\n
#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
\n我在这里和这里读到了关于__builtin_expect
的内容,但是仍然不清楚在(!!(x))
中双重布尔否定操作符的作用是什么。为什么要使用它?\n相关文件是这个。
(Double boolean negation operator)是为了确保所有真值都转换为1(从而与
这里出现双重否定的原因是为了在使用
双重否定的解决方法是,即使<__builtin_expect>不可用,也要保留双重否定,以保持代码的统一性。这样可以在调用者存储返回值以供其他用途使用时,保持代码的一致性。
下面是使用双重否定的示例代码:
#define GSL_LIKELY(x) (__builtin_expect(!!(x), 1)) #define GSL_UNLIKELY(x) (__builtin_expect(!!(x), 0)) int func(int x) { if (GSL_LIKELY(x > 0)) { return x + 1; } else { return x - 1; } }
在这个例子中,双重否定操作符用于将条件表达式的结果转换为1或0。这样可以提高条件语句的性能,因为编译器可以根据期望的结果进行优化。
总结起来,双重否定操作符的出现是为了在条件语句中使用