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

inq*_*uam 31 c++ bitwise-operators logical-operators

我有一些广泛使用的C++代码!!.我有点困惑,因为据我所知,!!它不是一个独立的运营商,而是两个!接一个的运营商.所以那就意味着!!foo和刚刚一样foo.

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

!!foo == foo

Nem*_*ric 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;
}
Run Code Online (Sandbox Code Playgroud)

打印foo != !!foo.

  • 更正式一点,其结果是"真实".`bool`类型的值是'true`和`false`.在算术上下文中,它们分别转换为"1"和"0". (4认同)
  • 假设你有一个地方将bool存储为1或0,有点或者什么.你检查的值是5(这将被视为真),你基本上可以把它变成1. (3认同)
  • 啊,而且......完全合情合理 (2认同)

Vic*_*and 8

它可以用作速记foo转换为布尔表达式.您可能希望仅出于某种原因将非布尔表达式转换为true或false.

foo = !!foo要拐弯foo进入1,如果是非零,并使其保持在0如果它已经是了.