首页 > 解决方案 > 为什么要写 `!!x`,当 `x` 可以呢?

问题描述

我经常看到有经验的程序员编写!!x,即使预期的表达式是布尔值(即,零或非零)而不是整数。

例如,来自 boost 的一行:

BOOST_ASSERT(!!p); // where `p` is a pointer

什么!!p时候p会做?

我对布尔参数的理解是一个转换为整数类型值的表达式,并且该值与零进行比较,显式或隐式(使用if或其等效的三元运算符)。

因此,如果我对布尔值的理解是正确的,那么任何需要布尔值并且只期望01错误实现的东西。

为了澄清:很明显!转换为bool; 问题是明确询问为什么

标签: c++boost

解决方案


默认情况下,BOOST_ASSERT(expr)展开为assert(expr). 该 C++assert函数采用标量参数,而不是bool. 因此,您的陈述“预期的表达式是布尔值”是不正确的。

C++ 中的类可以实现operator bool();这些basic_stream类就是这样的例子:assert(std::cin)不起作用。!!运算符强制使用std::cin::operator bool(),并且boolafter将!!被评估为int0 或 1。这比 短assert(bool(std::cin))


如果我是 boost 作者,我会扩展BOOST_ASSERT(expr)assert(!!(expr))- 就像( BOOST_LIKELY(!!(expr)) ? ((void)0) ).


推荐阅读