示例:
我们发现这是一些供应商编写的代码,我们试图找出他们为什么这样做。
bool tmp = false;
if (somecase)
tmp = true;
if (someOtherCase)
tmp |= true;
答案 0 :(得分:69)
没有充分的理由。布尔值|= true
始终为true
。这是有人想要花哨,或忘记布尔逻辑=)
将其更改为tmp = true;
。
答案 1 :(得分:16)
也许其中一个布尔文字曾经是一个变量,他们只是没有想到在更改操作数时更改运算符。显然逻辑是等价的。
更有可能的是,他们认为在第二种情况下,他们希望保留评估第一个“如果”条件的结果。当然,这是错误的推理。
更简单的等效陈述:
bool tmp = somecase | someOtherCase;
修改
正如pickypg所说,这句话可能令人困惑,因为大多数人不希望|
具有布尔值,许多人不会注意到它,或者不会考虑副作用的含义。明确的最佳方式(如果确实存在副作用)将是minitech的解决方案:只需将|=
更改为=
。
或者,如果someOtherCase
表达式没有副作用,请使用Jakub Konecki的解决方案:someCase || someOtherCase
。
答案 2 :(得分:7)
有趣 - 看起来它正在做同等的事情:
tmp = tmp | true;
始终将tmp设置为true。
答案 3 :(得分:7)
foo |= true
是foo = foo | true
的简短版本。
实际代码可以改写为
bool tmp = false;
tmp |= someCase;
tmp |= someOtherCase;
甚至更好
someCase || someOtherCase
答案 4 :(得分:4)
与其他op =运算符一样,x |= y
与x = x | y
等效(多重评估副作用除外)。这是写if (!x) x = y;
或if (y) x = true;
。
但是,在右侧有一个常量没有任何意义。
x |= true
更直接地写为x = true
x |= false
保持x
不变。为什么他们会这样做。
一些可能的解释是:
tmp = true;
而不是tmp |= true;
,但从未注意到它,因为他们的程序碰巧按预期工作。true
。tmp
原来是bitfield(|=
更有意义),后来缩减为一位。答案 5 :(得分:2)
最终结果将是“如果任何情况属实,结果将是真实的。”没有理由你必须使用运算符,因为||
中的if
也可以正常工作。
答案 6 :(得分:1)
聪明的编译器可以避免在这种情况下的赋值,虽然它可能不会因为它不应该使位操作短路。无论如何,它似乎是一种微观优化。实际上我怀疑它是作者使用位标志的暂停模式(或者他/她只是不明白它是如何工作的)。它会更好:
bool tmp = somecase || someOthercase;
(如果只使用一次,则内联临时)
请注意,使用标志时,确实有意义。
#define CONDITION_ONE 0x01
#define CONDITION_TWO 0x02
int temp = 0;
if (somecase) {
temp = CONDITION_ONE;
}
if (someOthercase) {
temp |= CONDITION_TWO;
}
答案 7 :(得分:0)
答案 8 :(得分:0)
使用| =赋值运算符表达式。查看MSDN
答案 9 :(得分:0)
对于bools而不是那么多
但是对于bitflags,这可以允许这样的代码:
int flags=0;
flags|=READ;
//flags|=UPDATE;
foo(arg,flags);
这允许一些标志很容易被注释掉(并使得使用的标志更容易被IMO读取)