c++ - 为什么要写 `!!x`,当 `x` 可以呢?
问题描述
我经常看到有经验的程序员编写!!x
,即使预期的表达式是布尔值(即,零或非零)而不是整数。
例如,来自 boost 的一行:
BOOST_ASSERT(!!p); // where `p` is a pointer
什么!!p
时候p
会做?
我对布尔参数的理解是一个转换为整数类型值的表达式,并且该值与零进行比较,显式或隐式(使用if
或其等效的三元运算符)。
因此,如果我对布尔值的理解是正确的,那么任何需要布尔值并且只期望0
或1
错误实现的东西。
为了澄清:很明显!
转换为bool
; 问题是明确询问为什么。
解决方案
默认情况下,BOOST_ASSERT(expr)
展开为assert(expr)
. 该 C++assert
函数采用标量参数,而不是bool
. 因此,您的陈述“预期的表达式是布尔值”是不正确的。
C++ 中的类可以实现operator bool()
;这些basic_stream
类就是这样的例子:assert(std::cin)
不起作用。!!
运算符强制使用std::cin::operator bool()
,并且bool
after将!!
被评估为int
0 或 1。这比 短assert(bool(std::cin))
。
如果我是 boost 作者,我会扩展BOOST_ASSERT(expr)
到assert(!!(expr))
- 就像( BOOST_LIKELY(!!(expr)) ? ((void)0) )
.
推荐阅读
- reactjs - 如何使用反应图表 js 2 为每个条设置 X 坐标?
- oracle - 将一个光标分配给另一个光标并循环遍历 for 循环
- html - 具有自动播放功能 (HLS) 的 M3U8 播放列表
- tensorflow - 在 CPU、GPU 和 TPU 中同时在 Coral 开发板上执行推理工作负载
- java - 从数字串中求和
- firebase - Firebase Analytics BigQuery 中的归因
- java - 在 Windows 上的 Web 应用程序中使用 Acrobat 打印 pdf
- magento - Magento 2.3 不发送订单确认电子邮件
- javascript -
.users.cache.size 不适用于 Discord.js 机器人 - typescript - Apollo 客户端 [BatchHttpLink] - 错误必须提供查询字符串