使用双逻辑非(!!)运算符混淆

时间:2013-04-24 12:00:16

标签: c++ bitwise-operators logical-operators

我有一些C ++代码可以广泛使用!!。我有点困惑,因为据我所知,!!不是自己的运算符,而是两个!之后的运算符。这意味着!!foofoo相同。

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

!!foo == foo

5 个答案:

答案 0 :(得分:49)

它不像双重否定那么简单。例如,如果您有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

答案 1 :(得分:8)

它可以用作将foo转换为布尔表达式的简写。您可能希望出于某种原因将非布尔表达式专门设置为true或false。

foo = !!foo如果它不为零,则会将foo变为1,如果已经存在,则将其保留在0

答案 2 :(得分:4)

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

答案 3 :(得分:3)

如果foo不是bool类型,则!!foo将是。{1}}。所以!!foo可以是1或0。

答案 4 :(得分:1)

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

相关问题