逻辑运算符“!!”与“nothing”的区别

11

我刚在微软的guiddef.h头文件中找到了这个:

__inline bool operator==(REFGUID guidOne, REFGUID guidOther)
{
    return !!IsEqualGUID(guidOne,guidOther);
}

两个惊叹号!!有什么意义,还是开发者当时只是随便搞了一下?


4
将值标准化为0或1是一种常见的方法,它还可以将其转换为整数类型。 - Shafik Yaghmour
相关问题 https://dev59.com/eHM_5IYBdhLWcg3wmkUK - sharptooth
这个可能不应该被标记为C,因为operator==是特定于C++的。 - Keith Thompson
2个回答

13

它关闭了Visual C++关于转换为布尔类型的愚蠢性能警告。


1
是的,这个警告是C4800。他们也可以使用return IsEqualGUID(guidOne, guidOther) != 0;,这实际上是一样的。 - sharptooth
@sharptooth:关于为什么“!= 0”不是常见的约定,这是因为它具有不同的优先级和位置,并且不利于前期视觉识别。因此,他们不能仅仅这样做也有很好的理由。从技术上讲,他们可以这样做,但效果不如其他方式。;-) - Cheers and hth. - Alf
鉴于C++标准类型bool的语义,!!!=0都是不必要的;转换将隐式进行,并且其行为方式与!!相同。该代码,或至少是该习惯用法,可能可以追溯到C++没有bool作为内置类型的时期,或者至少是在现代C++中它的行为方式之前。显式转换为bool(使用最合适的强制转换类型)可能会更清晰,并且可能还会抑制警告。 - Keith Thompson
@KeithThompson: 没有,其他方法不能压制警告。 - Cheers and hth. - Alf
一个显式转换不会阻止转换警告?叹气 - Keith Thompson
@KeithThompson:庆幸我们不再回到vc 6.0时代,否则我可以告诉你有关双重析构函数调用和其他有趣的事情。但是现在你让我想起来了,当时vc的行为真的很烦人,因为这意味着不能使用重新抛出异常处理习惯用法来集中处理各种异常类型。那时候这很重要,例如ibm lotus notes api会抛出整数和其他一些api。现在这些问题都可以合理地处理了,对我来说已经不再是问题了。嗯。 - Cheers and hth. - Alf

5
在这种情况下,Alf可能是正确的。
否则,将整数值标准化为逻辑运算的1(如果它们以非零值开始)或0(如果它们以零开始)是常见的习惯用语。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接