在C ++中使用按位运算符进行布尔运算

是否有任何理由不在C ++中使用按位运算符&,|和^作为“bool”值?

有时我会遇到两种条件中的一种必须为真(XOR)的情况,所以我只是将^运算符放入条件表达式中。 我有时也希望评估一个条件的所有部分,不管结果是否正确(而不是短路),所以我使用&和|。 我也需要累积布尔值,而且&=和| =可能非常有用。

在做这件事情时,我收到了一些提出的眉毛,但代码仍然比其他方式更有意义和更清晰。 有没有任何理由不使用这些bools? 是否有任何现代编译器为此提供不良结果?


||&&是布尔运算符,内置函数保证返回truefalse 。 没有其他的。

|&^是按位运算符。 当你操作的数字域只有1和0时,它们是完全一样的,但是如果你的布尔值不是严格的1和0--就像C语言的情况一样 - 你最终可能会有一些行为你不想要。 例如:

BOOL two = 2;
BOOL one = 1;
BOOL and = two & one;   //and = 0
BOOL cand = two && one; //cand = 1

然而,在C ++中, bool类型保证只是一个truefalse (它们分别隐式地转换为10 ),所以它更不担心这种立场,但人们并不习惯在代码中看到这样的事情是不做的一个很好的论点。 只要说b = b && x并完成它。


两个主要原因。 总之,仔细考虑; 可能有一个很好的理由,但如果在你的评论中有非常明确的地方,因为它可能是脆弱的,并且正如你自己所说的,人们通常不习惯看到这样的代码。

按位异或!=逻辑异或(除了0和1)

首先,如果您使用的值不是falsetrue (或01 ,作为整数),则^操作符可以引入不等于逻辑异或的行为。 例如:

int one = 1;
int two = 2;

// bitwise xor
if (one ^ two)
{
  // executes because expression = 3 and any non-zero integer evaluates to true
}

// logical xor; more correctly would be coded as
//   if (bool(one) != bool(two))
// but spelled out to be explicit in the context of the problem
if ((one && !two) || (!one && two))
{
  // does not execute b/c expression = ((true && false) || (false && true))
  // which evaluates to false
}

感谢用户@Patrick首先表达了这一点。

操作顺序

第二, |&^作为按位运算符,请勿短路。 另外,通过优化编译器,可以重新排列多个按位运算符链接在一个语句中 - 即使带有明确的括号 - 也可以重新排序,因为所有3个操作通常都是可交换的。 如果操作的顺序很重要,这很重要。

换一种说法

bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false

并不总是给出相同的结果(或结束状态)

bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler

这一点尤其重要,因为您可能无法控制方法a()b() ,或者其他人可能会出现并稍后改变它们而不理解依赖关系,并导致一个令人讨厌的(并且通常是仅发布版本)错误。


我认为

a != b

是你想要的

链接地址: http://www.djcxy.com/p/75001.html

上一篇: Using bitwise operators for Booleans in C++

下一篇: Button onclick does not execute function