35

我有一些广泛使用!!. 我有点困惑,因为据我所知!!,它不是一个单独的操作员,而是两个!接一个。所以这意味着这!!foo与 just 相同foo

有什么地方和/或理由!!真正有意义吗?我在想它是否可能有一点明智的意义?foo所以你首先对结果执行一些位操作!?但我似乎不记得!被用作一个有点明智的操作员,似乎也没有找到任何参考告诉我它是。据我所知!,仅用作逻辑运算符,在这种情况下

!!foo == foo

4

5 回答 5

55

它不像双重否定那么简单。例如,如果您有x == 5,然后应用两个 !运算符 ( !!x),它将变为 1 - 因此,它用于标准化{0, 1}范围内的布尔值。

请注意,您可以将零用作布尔值 false,将非零值用作布尔值 true,但您可能需要将结果标准化为 0 或 1,这!!是有用的时候。

它与 相同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

于 2013-04-24T12:03:10.693 回答
9

它可以用作foo转换为布尔表达式的速记。出于某种原因,您可能只想将非布尔表达式转换为 true 或 false。

foo = !!foo如果它不为零,它将变成,如果foo它已经是,则将其保留。10

于 2013-04-24T12:02:15.067 回答
4

如果foo != 0,那么!!foo == 1。转换为 bool 基本上是一个技巧。

于 2013-04-24T12:02:07.560 回答
3

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

于 2013-04-24T12:04:11.630 回答
2

此技术用于在布尔上下文中对变量进行安全评估。如果您与 bool ( operator bool()) 进行正常对话,则无关变量(具有不同类型)可能会以不需要的方式参与布尔表达式。operator!实现了返回否定布尔值的定义。它的结果必须再次被否定。只需看看Safe bool idiom

于 2013-04-24T12:41:10.597 回答