宏定义中的双重否定(如 (!!(expr)))的用途是什么?
可能的重复:
C++ 代码中的双重否定。
我正在阅读代码库,发现类似这样的内容:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
我无法弄清楚为什么使用 (!!(expr)) 而不是单个 (expr)< /强>。无论如何,双重否定意味着积极,不是吗?我错过了什么吗?
Possible Duplicate:
Double Negation in C++ code.
I'm reading a code base, and find something like this:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
I cannot figure out why (!!(expr)) is used instead of a single (expr). Anyway, a double negative means positive, is not it? Am I missing something?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是一种将表达式转换为 bool 的方法。但在 C++ 中,运算符!可以超载。 C/C++ 的另一种方式:
仅 C++ 方式:
[编辑]
进一步考虑 C++ 运算符重载,避免使用运算符是有意义的。像 Boost.Spirit 和 Boost.Lambda 这样的库使用表达式模板和惰性求值,因此像
(expr) || 这样的表达式call()
的行为可能与预期不符。该宏的最防弹版本如下所示:这里,仅使用
expr
到 bool 的转换。需要else
分支来防止诸如uasert(x) else Something_else();
之类的表达式。It is a way to cast an expression to bool. In C++ though, operator! can be overloaded. Another way for C/C++:
C++ only way:
[Edit]
Thinking more about C++ operator overloading, it make sense to avoid using operators. Libraries like Boost.Spirit and Boost.Lambda use expression templates and lazy evaluation, so that expressions like
(expr) || call()
may behave not as expected. The most bullet proof version of that macro looks like this:Here, only conversion of
expr
to bool is used. Theelse
branch is needed to protect from expressions likeuassert(x) else something_else();
.它只是确保宏的 expr 部分转换为布尔值。
It will just make sure that the expr part of the macro is converted to a bool.
它是 C++ 中有时用于转换为布尔类型的习惯用法。
It is an idiom sometimes used in C++ for converting to a boolean type.
在您向我们展示的示例中,
!!
完全没有用。然而,一般来说,它被用作 C99 之前版本的粗略等效于转换为_Bool
,即 0 保持 0,任何其他值变为 1。In the example you showed us, the
!!
is utterly useless. However, in general it's used as a pre-C99 rough equivalent to casting to_Bool
, i.e. 0 stays 0 and any other value becomes 1.