【发布时间】:2011-11-10 20:57:13
【问题描述】:
对我来说,布尔变量表示 true 或 false。
一些布尔变量被定义并初始化为我们未知的值。我只想得到它的相反值。我应该如何在 C++ 中做到这一点?
【问题讨论】:
对我来说,布尔变量表示 true 或 false。
一些布尔变量被定义并初始化为我们未知的值。我只想得到它的相反值。我应该如何在 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';
作为一个练习,尝试找出上述解决方案为何有效。
【讨论】:
b=1-b RHS 得到提升自动
您可以选择是写!,还是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 作为关键字。好东西阿尔夫
您需要 NOT 运算符,即 C、C++ 和许多其他相关语言中的 !。
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)));【讨论】:
你需要使用 not 操作符,否则它会给你相反的结果
!
这应该可以满足您的需求。
【讨论】:
bool opposite = (someboolvar) ? 0 : 1 ;
【讨论】:
!) 可以使用时,不要使用复杂的运算符。你未来的维护者会盯着代码想知道它到底应该做什么,却没有意识到它是正确的。
bool opposite = (someboolvar == false);
?: 或0:1 而不是false:true 更多。