我刚刚进入一个拥有相当庞大代码库的项目.
我主要处理C++,他们编写的很多代码都使用布尔逻辑的双重否定.
if (!!variable && (!!api.lookup("some-string"))) {
do_some_stuff();
}
Run Code Online (Sandbox Code Playgroud)
我知道这些人都是聪明的程序员,很明显他们不会偶然这样做.
我不是经验丰富的C++专家,我唯一猜测他们这样做的原因是他们想要绝对肯定被评估的值是实际的布尔表示.所以他们否定它,然后再次否定它以使其恢复到它的实际布尔值.
这是正确的,还是我错过了什么?
我遇到了以下代码段:
pt->aa[!!(ts->flags & MASK)] = -val;
Run Code Online (Sandbox Code Playgroud)
!!(双惊叹号/感叹号/两个非操作符)代表c?(!!NULL) == NULL吗?我有一些广泛使用的C++代码!!.我有点困惑,因为据我所知,!!它不是一个独立的运营商,而是两个!接一个的运营商.所以那就意味着!!foo和刚刚一样foo.
!!实际上是否有任何地方和/或理由?我在考虑它是否可能有一些明智的含义?那么你首先执行一些有点操作foo,然后!对结果执行?但我似乎不记得!被用作一个有点明智的操作员,似乎没有找到任何参考告诉我它也是.据我所知!,仅用作逻辑运算符,在这种情况下
!!foo == foo
可能重复:
C++代码中的双重否定
让我们说:
bool var = !!true;
Run Code Online (Sandbox Code Playgroud)
它将为变量赋予"true".似乎没用,但我看的是Visual Studio对"断言"的定义,它是:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
Run Code Online (Sandbox Code Playgroud)
为什么它两次否定"_Expression"?
我想知道他们想强迫"!" 要调用的运算符(在它超载的情况下),但这似乎不是一个好理由.