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

6

在我看来,bool变量表示的是truefalse

有一个bool变量被定义并初始化了一个我们不知道的值。我只想获取它的相反值。在C++中应该如何做到这一点?

7个回答

28

只需使用!运算符:

bool x = // something

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

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

作为练习,尝试弄清楚为什么上述解决方案有效。


2
+1 对于创意回答并带有适当警告,但我不会使用 C 风格的强制转换来编写这个代码。我甚至不确定你是否需要进行强制转换,例如 b=1-b 右侧的类型会自动提升。 - Flexo
@awoodland:谢谢。我移除了强制转换。我一直在考虑强制转换,所以加了它们,但当然它们是不必要的。 - Cam
你的第一个解决方案是我想到的第一个 :) - Pramod

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

关于比较布尔值:

一些新手会写出如下的代码:

    v != true

这不仅啰嗦,而且是一种极其危险的习惯。之所以危险,是因为许多API定义了布尔类型,其中可能的值不仅限于0和1(一个典型的例子是Window的BOOL类型)。因此,一个值可以表示逻辑True,但在数值上并不等于True。
因此,为了最大限度地保证安全,请养成使用!或not的习惯,并永远不要直接与字面布尔值进行比较。
需要比较布尔值的一个通常情况是需要逻辑Xor(异或,二者中的一个)。C++缺少在bool级别上的运算符。但是你可以写a != b来实现与假设的bool级别Xor运算符相同的效果。

作为受控反转的逻辑异或

在某些情况下,如果满足某个条件,您希望进行反转(应用逻辑非),例如...

    if( condition )
    {
        x = !x;
    }

这也可以用另一种方式表达,即...
    x = ((condition) != x);

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

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

  • 它是一个纯表达式计算,不涉及执行路径的选择,因此它可以被用作优化(然而,我了解到如果适当的话,现代编译器可能会在机器代码级别为您执行此操作)。


1
不知道可以将 not 作为关键字使用。很棒的东西,Alf。 - thecoshman

9
您需要使用 NOT 运算符,它在 C、C++ 等相关语言中是 !
bool t = true;
bool f = !t;    // f = false

5

假设已经适当设置了 bool value;:

你应该使用以下内容:

  !value

这里的!表示逻辑非。

此外,还有其他几种达到相同效果的方法,这些方法都是有效的混淆技巧:

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

4
你需要使用逻辑非运算符,这样它会给你相反的结果。
    !

这应该能给你所需的东西。

-1
bool opposite = (someboolvar) ? 0 : 1 ;

8
当简单的操作符(!)可以胜任时,请不要使用复杂的操作符。未来的维护人员将会盯着代码想弄清楚它真正的作用,而没有意识到代码本身已经正确无误。 - Mark B
4
@Paul 大家都已经给出了正确的答案,所以我决定发表一个替代方案。顺便说一句,如果我发现我的公司中有人盯着这段代码并想知道它做什么,那么这个人可以去找新工作了。 - karlphillip
5
这个回答与问题一样恰当。 - deft_code
11
如果想要做的只是产生与正确答案不同但仍能得到正确结果的内容,我赞成使用bool opposite = (someboolvar == false); - Steve Jessop
3
我在想我更讨厌使用?:还是0:1来代替false:true - MSalters
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接