如何在C++中获得bool变量的相反值

Ter*_* Li 5 c++ variables boolean

对我来说,bool变量表示truefalse.

定义了一些bool变量并将其初始化为我们未知的值.我只想得到相反的价值.我应该如何在C++中完成它?

Mys*_*ial 27

只需使用!运营商:

bool x = // something

bool y = !x;  //  Get the opposite.
Run Code Online (Sandbox Code Playgroud)


Cam*_*Cam 15

bool b = false;
Run Code Online (Sandbox Code Playgroud)

正确的解决方案:

b = !b;
Run Code Online (Sandbox Code Playgroud)

您不应该使用的有趣解决方案:

b = b?false:true;
b ^= 1;
b = (b+1)%2;
b = 1>>b;
b = 1-b;
b = b-1;
b = -1*(b-1);
b = b+'0'+'1'-'b';
Run Code Online (Sandbox Code Playgroud)

作为练习,尝试找出上述解决方案的工作原理.

  • 对于具有适当警告的创意答案+1,但我不会用C样式演员表示,我甚至不确定你需要演员表,例如`b = 1-b`,RHS会自动升级 (2认同)

Che*_*Alf 11

逻辑运算符不

您可以选择是否要编写!,或者not混合使用.

但是,从版本10.0开始,Visual C++没有not内置的保留字.

因此对于Visual C++,如果要使用not,则必须包含[ iso646.h ]标头,它是标准C库中的标头,保证在C++中也可用.但是,对于符合标准的C++编译器,包括该头部没有任何影响(如C++ 11标准的脚注176所述).所以你无论如何都可以包括它:

#include <iostream>
#include <iso646.h>  // Visual C++ is not quite standard and requires this.

int main()
{
    using namespace std;

    // Display false and true as "false" and "true":
    cout << boolalpha;

    cout << "!false = " << !false << endl;
    cout << "not false = " << not false << endl;
}
Run Code Online (Sandbox Code Playgroud)

关于COMPARING布尔值:

有些新手写的东西就像

    v != true
Run Code Online (Sandbox Code Playgroud)

这不仅仅是冗长而且是一种彻头彻尾的危险习惯.它很危险的原因是许多API定义了布尔类型,其中可能的值不仅限于0和1(一个主要的例子是Window的BOOL类型).然后,值可以表示逻辑True,而不是在数值上等于True.

所以,最大的安全性,使它成为一个习惯使用!或者not,只是从来没有直接比较,以文字布尔值.

通常需要比较布尔值的示例是您需要逻辑Xor(独占或者,或者).C++缺乏该bool级别的运算符.但是你可以编写a != b以实现与boolXor运算符所具有的假设级别相同的功能.


逻辑Xor作为受控反转

在某些情况下,如果某些条件为真,则需要反转(逻辑Not的应用),例如......

    if( condition )
    {
        x = !x;
    }
Run Code Online (Sandbox Code Playgroud)

这可以写成......

    x = ((condition) != x);
Run Code Online (Sandbox Code Playgroud)

它看起来像完全混淆,但它有两个功能,在某些情况下可以很方便:

  • 它可以用作一组a值的"屏蔽"反转,其他一些数组的值用于控制每个元素是否a被反转,以及

  • 它是一个纯粹的表达式计算,不涉及执行路径的选择,因此可以想象它可以用作优化(但是,我认为现代编译器可能会在机器代码级别为您执行此操作,如果它是适当的).

干杯&hth.,


Pau*_*l R 10

您需要NOT运算符,它!使用C,C++和许多其他相关语言.

bool t = true;
bool f = !t;    // f = false
Run Code Online (Sandbox Code Playgroud)


Fle*_*exo 6

如果bool value;设置得当:

你应该使用这个:

  !value
Run Code Online (Sandbox Code Playgroud)

哪里!逻辑不在这里.

此外,还有许多其他方法可以达到相同的效果,这些方法都是有效的混淆:

  1. std::not_equal_to<bool>()(true,value);(要求#include <functional>)
  2. std::count(&value, &value+1, false);(要求#include <algorithm>)
  3. std::count_if(&value,&value+1,std::not1(std::bind2nd(std::greater_equal<bool>(), true)));