在我看来,bool变量表示的是true或false。
有一个bool变量被定义并初始化了一个我们不知道的值。我只想获取它的相反值。在C++中应该如何做到这一点?
只需使用!
运算符:
bool x = // something
bool y = !x; // Get the opposite.
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';
作为练习,尝试弄清楚为什么上述解决方案有效。
你可以选择写!
、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
在某些情况下,如果满足某个条件,您希望进行反转(应用逻辑非),例如...
if( condition )
{
x = !x;
}
x = ((condition) != x);
看起来完全是混淆的,但它有两个功能,在某些情况下很方便:
可以用作数组a
的一种“掩码”反转,其他数组的值用于控制是否反转a
的每个元素,以及
它是一个纯表达式计算,不涉及执行路径的选择,因此它可以被用作优化(然而,我了解到如果适当的话,现代编译器可能会在机器代码级别为您执行此操作)。
not
作为关键字使用。很棒的东西,Alf。 - thecoshman!
。bool t = true;
bool f = !t; // f = false
假设已经适当设置了 bool value;
:
你应该使用以下内容:
!value
这里的!
表示逻辑非。
此外,还有其他几种达到相同效果的方法,这些方法都是有效的混淆技巧:
std::not_equal_to<bool>()(true,value);
(需要包含#include <functional>
)std::count(&value, &value+1, false);
(需要包含#include <algorithm>
)std::count_if(&value,&value+1,std::not1(std::bind2nd(std::greater_equal<bool>(), true)));
!
bool opposite = (someboolvar) ? 0 : 1 ;
!
)可以胜任时,请不要使用复杂的操作符。未来的维护人员将会盯着代码想弄清楚它真正的作用,而没有意识到代码本身已经正确无误。 - Mark Bbool opposite = (someboolvar == false);
。 - Steve Jessop?:
还是0:1
来代替false:true
。 - MSalters
b=1-b
右侧的类型会自动提升。 - Flexo