【问题标题】:How to get the opposite value of a bool variable in C++如何在 C++ 中获取布尔变量的相反值
【发布时间】:2011-11-10 20:57:13
【问题描述】:

对我来说,布尔变量表示 truefalse

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

【问题讨论】:

    标签: c++ variables boolean


    【解决方案1】:

    只需使用! 运算符:

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

    【讨论】:

      【解决方案2】:
      bool b = false;
      

      正确的解决方案:

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

      作为一个练习,尝试找出上述解决方案为何有效。

      【讨论】:

      • +1 用于带有适当警告的创造性答案,但我不会用 C 风格的演员表来写,我什至不确定你是否需要演员表,例如b=1-b RHS 得到提升自动
      • @awoodland:谢谢。我取下了石膏。我在考虑演员阵容,所以我把它们放进去了,但当然它们是不必要的。
      • 你的第一个解决方案是我想到的第一个解决方案 :)
      【解决方案3】:

      逻辑非运算符

      您可以选择是写!,还是not,或者混合使用。

      但是,Visual C++ 10.0 版仍然没有内置保留字 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;
      }
      

      关于比较布尔值:

      有些新手会这样写

          v != true
      

      这不仅是冗长的,而且是一个彻头彻尾的危险习惯。它之所以危险,是因为许多 API 定义了布尔类型,其中可能的值不仅限于 0 和 1(一个典型的例子是 Window 的 BOOL 类型)。那么一个值可以表示逻辑真,但在数值上不等于真。

      因此,为了最大程度的安全,请养成使用!not 的习惯,并且从不直接与文字布尔值比较。

      通常需要比较布尔值的一个示例是您需要逻辑 Xor(异或,非此即彼)。 C++ 在bool 级别缺少一个运算符。但是您可以编写 a != b 来实现与假设的 bool 级 Xor 运算符相同的效果。


      逻辑异或作为受控反转

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

          if( condition )
          {
              x = !x;
          }
      

      这也可以写成……

          x = ((condition) != x);
      

      它看起来像是完全混淆了,但它有两个在某些情况下可以派上用场的功能:

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

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

      【讨论】:

      • 不知道可以使用not 作为关键字。好东西阿尔夫
      【解决方案4】:

      您需要 NOT 运算符,即 C、C++ 和许多其他相关语言中的 !

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

      【讨论】:

        【解决方案5】:

        鉴于 bool value; 已正确设置:

        你应该使用这个:

          !value
        

        ! 的逻辑不在这里。

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

        1. std::not_equal_to&lt;bool&gt;()(true,value);(需要#include &lt;functional&gt;
        2. std::count(&amp;value, &amp;value+1, false);(需要#include &lt;algorithm&gt;
        3. std::count_if(&amp;value,&amp;value+1,std::not1(std::bind2nd(std::greater_equal&lt;bool&gt;(), true)));

        【讨论】:

          【解决方案6】:

          你需要使用 not 操作符,否则它会给你相反的结果

              !
          

          这应该可以满足您的需求。

          【讨论】:

            【解决方案7】:
            bool opposite = (someboolvar) ? 0 : 1 ;
            

            【讨论】:

            • 当一个简单的运算符 (!) 可以使用时,不要使用复杂的运算符。你未来的维护者会盯着代码想知道它到底应该做什么,却没有意识到它是正确的。
            • @Paul 每个人都击败了我,得到了真正的答案,所以我决定发布一个替代方案。 顺便说一下,如果我发现我公司的某个人盯着这段代码想知道它的作用,那么这个人就可以去寻找新工作了。
            • 这个答案和问题一样合适。
            • 如果这个想法只是为了产生与正确答案不同的东西,同时仍然产生正确的结果,我投票bool opposite = (someboolvar == false);
            • 我想知道我是否不喜欢?:0:1 而不是false:true 更多。
            猜你喜欢
            • 2011-10-25
            • 1970-01-01
            • 1970-01-01
            • 2020-03-27
            • 2012-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-12
            相关资源
            最近更新 更多