我正在阅读代码库,并找到类似的内容:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
我无法弄清楚为什么使用(!!(expr))而不是单个(expr)。无论如何,双重否定意味着积极,不是吗?我错过了什么吗?
答案 0 :(得分:6)
这是一种将表达式强制转换为bool的方法。但是在C ++中,运算符!可以超载。 C / C ++的另一种方式:
0 != (expr)
仅限C ++:
static_cast<bool>(expr)
<强> [编辑] 强>
更多地考虑C ++运算符重载,避免使用运算符是有意义的。像Boost.Spirit和Boost.Lambda这样的库使用表达式模板和延迟评估,因此像(expr) || call()
这样的表达式可能表现不像预期的那样。该宏的最防弹版本如下所示:
#define uassert(expr) if(expr) {} else { uasserted(...); }
此处,仅使用expr
到bool的转换。需要else
分支来保护uassert(x) else something_else();
等表达式。
答案 1 :(得分:1)
它只会确保宏的expr部分转换为bool。
答案 2 :(得分:1)
有时在C ++中用于转换为布尔类型的习惯用法。
答案 3 :(得分:0)
在你向我们展示的例子中,!!
完全没用。但是,一般来说,它被用作前C99粗略等效于转换为_Bool
,即0保持为0,任何其他值变为1。