【发布时间】:2011-02-05 23:08:26
【问题描述】:
我正在阅读代码库,并找到类似这样的内容:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
我不明白为什么使用 (!!(expr)) 而不是单个 (expr)。无论如何,双重否定意味着积极,不是吗?我错过了什么吗?
【问题讨论】:
-
我什至无法弄清楚这段代码的目的是什么! ;)
-
就像 R 说的,这里完全没用。
-
正如您自己正确指出的那样,在这种情况下它是多余的。也许它只是为了避免一些编译器警告而添加的。
-
@AndersK。你说的对。它可能是为了满足某些编译器而添加的。正如@R 和@GMan 指出的那样,虽然这是一种强制进行布尔对话的方法,但这里不需要 !! 技巧。因为它已经在布尔上下文中。我现在很清楚了。谢谢。
-
'-' 是否定的; '!'不是。 “消极”和“积极”在这里不适用。使用不正确的术语会造成混乱。
标签: c++ c gcc compiler-construction macros