通过使用双逻辑非(!)运算符混淆[重复](Confused by use of double log

2019-09-01 01:05发布

这个问题已经在这里有一个答案:

  • c + +中的代码双重否定 14回答
  • 什么是“!!”用C? [重复] 7个答案

我有一些C ++代码,使广泛使用的!! 。 我有点困惑,因为据我所知!! 是不是它自己的,但两个运营商! 之后对方。 因此,这将意味着!!foo是一样的只是foo

是否有任何地方,或原因,当!! 实际上是有意义的? 我在想,如果它或许可以有一点聪明的含义是什么? 所以,你先执行一些逐位操作foo然后! 这一结果? 但我似乎不记得! 被用作逐位操作,似乎没有找到任何引用告诉我,它要么是。 至于我可以告诉大家! 在仅作为一个逻辑运算符和在这种情况下

!!foo == foo

Answer 1:

它不像双重否定一样简单。 举例来说,如果你有x == 5 ,然后应用两种! 运算符( !!x ),这将成为1 -因此,它被用于在标准化布尔值{0, 1}的范围。

请注意,您可以使用零为布尔值false,并为逻辑真不为零,但你可能需要将结果归为0或1,那就是当!! 是非常有用的。

这是一样的x != 0 ? 1 : 0 x != 0 ? 1 : 0

此外, 请注意,如果这不会是真正的 foo不是{0, 1}集:

!!foo == foo

#include <iostream>

using namespace std;

int main()
{
        int foo = 5;

        if(foo == !!foo)
        {
                cout << "foo == !!foo" << endl;
        }
        else
        {
                cout << "foo != !!foo" << endl;
        }



        return 0;
}

打印foo != !!foo



Answer 2:

它可以用作速记转foo成布尔表达式。 您可能希望把一个非布尔表达式为true或false完全出于某种原因。

foo = !!foo要拐弯foo1如果是不为零,并使其保持在0 ,如果它已经是了。



Answer 3:

如果foo != 0 ,那么!!foo == 1 。 它基本上是要转换为布尔一招。



Answer 4:

如果foo是bool类型的不是,那么!!foo会。 所以!!foo可以是1或0。



Answer 5:

该技术是在布尔上下文中的一个变量的安全评估。 如果你有一个正常的对话为bool( operator bool()不相关的变量(用不同的充型)可以以意外方式参与布尔表达式。 的确定指标operator! 它返回一个否定的布尔值被实现。 而其结果必须被再次被否定。 只要看看在安全布尔成语 。



文章来源: Confused by use of double logical not (!!) operator [duplicate]