C++ 如何在C++;

C++ 如何在C++;,c++,variables,boolean,C++,Variables,Boolean,对我来说,bool变量表示true或false 一些bool变量被定义并初始化为我们未知的值。我只想得到它的相反值。在C++中,我应该如何做?< p>只使用!操作员: bool x = // something bool y = !x; // Get the opposite. 您需要NOT运算符,它是 bool t = true; bool f = !t; // f = false 给定bool值已正确设置: 为此,您应使用: !value 其中不在此处 此外,还有许多其

对我来说,bool变量表示truefalse


一些bool变量被定义并初始化为我们未知的值。我只想得到它的相反值。在C++中,我应该如何做?

< p>只使用<代码>!<代码>操作员:

bool x = // something

bool y = !x;  //  Get the opposite.

您需要NOT运算符,它是

bool t = true;
bool f = !t;    // f = false

给定
bool值已正确设置:

为此,您应使用:

  !value
其中
不在此处

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

  • std::不等于()(需要
    #包括
  • std::count(&value,&value+1,false)(需要
    #包括
  • std::count_if(&value,&value+1,std::not1(std::bind2nd(std::greater_equal(),true))

  • 您需要使用not运算符,这样它会给出相反的结果

        !
    
    这应该能满足您的需要。

    逻辑Not的运算符
    bool opposite = (someboolvar) ? 0 : 1 ;
    
    您可以选择是否要编写
    ,或
    ,或某种混合物

    但是,10版Visual C++没有保留的单词<代码>不是< /COD>内置的.< /P> 不是< /C>,你必须包括[<强> ISO64 6. 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;
    }
    
    这不仅冗长,而且是一个彻头彻尾的危险习惯。它危险的原因是许多API定义的布尔类型中可能的值不限于0和1(一个主要的例子是Window的
    BOOL
    type)。然后,一个值可以表示逻辑上的True,但在数值上不等于True

    因此,为了最大限度的安全,请养成使用
    的习惯
    不是
    ,只是永远不要直接与文本布尔值进行比较

    一个通常需要比较布尔值的示例是,您需要逻辑异或(异或,或或)。C++在<<代码>布尔O/COS>级别缺少操作符。但是你可以写
    a!=b
    实现与假设的
    bool
    相同的异或级运算符


    作为受控反转的逻辑异或 在某些情况下,如果某些条件为真,则需要反转(逻辑Not的应用),如

        if( condition )
        {
            x = !x;
        }
    
    这也可以写成

        x = ((condition) != x);
    
    它看起来像是完全混淆,但它有两个功能,在某些情况下非常方便:

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

    • 这是一个纯表达式计算,不涉及执行路径的选择,因此可以将其用作优化(但是,我认为,如果合适的话,现代编译器可能会在机器代码级别为您这样做)


    正确的解决方案:

    b = !b;
    
    您不应使用的有趣解决方案:

    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';
    

    作为练习,试着找出上述解决方案起作用的原因。

    当一个简单的(
    )就可以了时,不要使用复杂的运算符。你未来的维护人员会盯着代码看,想知道它到底应该做什么,却没有意识到它是正确的。@Paul Everyone告诉了我真正的答案,所以我决定发布一个替代方案。顺便说一句,如果我发现公司里有人盯着这个代码看,想知道它是干什么的,这个人可以去寻找一份新工作。这个答案和问题一样合适。如果这个想法只是为了在产生正确结果的同时产生一些与正确答案不同的东西,我会投票(someboolvar==false);
    我想知道我是不喜欢
    ?:
    还是
    0:1
    而不是
    false:true
    更多。+1对于带有适当警告的创造性回答,但我不会用C风格的类型转换来写,我甚至不确定你是否需要这些类型转换,例如
    b=1-b
    RHS得到提升automatically@awoodland:谢谢。我删除了演员阵容。我在考虑演员阵容,所以我把他们放进去了,但当然他们是不必要的。你的第一个解决方案是我想到的第一个:)我不知道如何使用
    而不是
    作为关键字。好东西,阿尔夫
    
    b = !b;
    
    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';