为什么在C#中对布尔值使用| =运算符?

时间:2012-03-28 14:41:54

标签: c# boolean

示例:

我们发现这是一些供应商编写的代码,我们试图找出他们为什么这样做。

bool tmp = false;

if (somecase)
   tmp = true;

if (someOtherCase)
   tmp |= true;   

10 个答案:

答案 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 |= truefoo = foo | true的简短版本。

实际代码可以改写为

bool tmp = false;
tmp |= someCase;
tmp |= someOtherCase;

甚至更好

someCase || someOtherCase

答案 4 :(得分:4)

与其他op =运算符一样,x |= yx = x | y等效(多重评估副作用除外)。这是写if (!x) x = y;if (y) x = true;

的简洁方式

但是,在右侧有一个常量没有任何意义。

  • x |= true更直接地写为x = true
  • x |= false保持x不变。
  

为什么他们会这样做。

一些可能的解释是:

  • 这是一个错字:他们打算写tmp = true;而不是tmp |= true;,但从未注意到它,因为他们的程序碰巧按预期工作。
  • RHS最初是一个变量,在不改变代码的情况下被替换为常量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)

这相当于

tmp = tmp | true;

编辑: 等于

tmp = true;

我同意其余的海报......!

更多信息here

答案 8 :(得分:0)

使用| =赋值运算符表达式。查看MSDN

答案 9 :(得分:0)

对于bools而不是那么多

但是对于bitflags,这可以允许这样的代码:

int flags=0;
flags|=READ;
//flags|=UPDATE;
foo(arg,flags);

这允许一些标志很容易被注释掉(并使得使用的标志更容易被IMO读取)