为什么写`!!x`,什么时候写`x`?

Hri*_*sip 7 c++ boost

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

例如,来自 boost 的一行:

BOOST_ASSERT(!!p); // where `p` is a pointer
Run Code Online (Sandbox Code Playgroud)

什么!!p时候才p做呢?

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

因此,如果我对 Boolean 的理解是正确的,那么任何需要 Boolean 并且只期望0或被1错误实现的东西。

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

S.M*_*.M. 10

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

C++ 中的类可以实现operator bool();这些basic_stream类是这样的例子:assert(std::cin)不会工作。的!!操作者的力的使用std::cin::operator bool(),和bool之后!!将被评估,以int0或1这是一个比短assert(bool(std::cin))


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