在C ++中使用按位运算符进行布尔运算
是否有任何理由不在C ++中使用按位运算符&,|和^作为“bool”值?
有时我会遇到两种条件中的一种必须为真(XOR)的情况,所以我只是将^运算符放入条件表达式中。 我有时也希望评估一个条件的所有部分,不管结果是否正确(而不是短路),所以我使用&和|。 我也需要累积布尔值,而且&=和| =可能非常有用。
在做这件事情时,我收到了一些提出的眉毛,但代码仍然比其他方式更有意义和更清晰。 有没有任何理由不使用这些bools? 是否有任何现代编译器为此提供不良结果?
||
和&&
是布尔运算符,内置函数保证返回true
或false
。 没有其他的。
|
, &
和^
是按位运算符。 当你操作的数字域只有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
类型保证只是一个true
或false
(它们分别隐式地转换为1
和0
),所以它更不担心这种立场,但人们并不习惯在代码中看到这样的事情是不做的一个很好的论点。 只要说b = b && x
并完成它。
两个主要原因。 总之,仔细考虑; 可能有一个很好的理由,但如果在你的评论中有非常明确的地方,因为它可能是脆弱的,并且正如你自己所说的,人们通常不习惯看到这样的代码。
按位异或!=逻辑异或(除了0和1)
首先,如果您使用的值不是false
和true
(或0
和1
,作为整数),则^
操作符可以引入不等于逻辑异或的行为。 例如:
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