<分区>
Possible Duplicate:
Double Negation in C++ code.
我正在阅读代码库,并找到类似这样的内容:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
我不明白为什么使用 (!!(expr)) 而不是单个 (expr)。无论如何,双重否定意味着肯定,不是吗?我错过了什么吗?
<分区>
Possible Duplicate:
Double Negation in C++ code.
我正在阅读代码库,并找到类似这样的内容:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
我不明白为什么使用 (!!(expr)) 而不是单个 (expr)。无论如何,双重否定意味着肯定,不是吗?我错过了什么吗?
最佳答案
这是一种将表达式转换为 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();
这样的表达式。
关于c++ - 宏定义中双重否定的目的是什么,比如 (!!(expr))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910313/