【问题标题】:Why do a bitwise and?为什么要按位与?
【发布时间】:2014-10-08 01:13:16
【问题描述】:

我只是好奇的代码没有问题。我正在查看这段代码,我试图弄清楚为什么它们按位而不是常规&&

bool bValid = true;
.... // some code here
bValid &= IsASMConfigurationValid(this.m_ThisDevices[BDCASM], ref el);
.... // more code here
bValid &= IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE], ref el);

我只想知道为什么这样做,而不是仅仅将 bValid = 设置为 IsConfigValid。这很可能只是他的编码风格。

【问题讨论】:

  • 如果这是您使用此代码的唯一问题...
  • 布尔值没有“按位与”,有一个“非短路”......所以不清楚你的问题是什么......
  • Here's some good info 关于布尔值时 &&& 之间的区别。
  • 标志的顺序更新?如果这些 IsASM 调用中的任何一个返回 false,则 bValid 变为 false 并且 STAYS 为 false
  • 放松伙计们,OP 提到这不是他的代码。我们不要假设他是个 goto 爱变态的人。

标签: c# bitwise-and


【解决方案1】:

我可以看到一些选项:

请记住,bool 操作数没有按位运算,所以它只是一个逻辑与。

所有内容都非常个人化,最好的答案将来自真正的开发者。

【讨论】:

    【解决方案2】:

    让我们看看这一行:

    bValid &= IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE], ref el);

    这可以重写为:

    bValid = bValid && IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE], ref el);

    if(bValid) { bValid = IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE], ref el); }

    ...或其他类似的形式。 &= 使代码缩短了几个字符,但正如您所发现的,主要只是使其更难阅读。

    更新:正如评论者指出的那样,&= 不会短路像 && 这样的布尔值,因此仍然调用右侧函数的真正替代方案是:

    var temp = IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE], ref el); bValid = bValid && temp

    【讨论】:

    • 我想说使用&= 的唯一原因会有所不同,如果IsSPEConfigurationValid 有一些副作用,即使bValid 在这一点上是错误的,开发人员也需要它运行.这本身就是一种代码味道。
    • "这可以重写为 ... && " - 两行之间存在巨大差异 - 您的代码将无法运行 bValid == false 情况下的函数。
    • @AlexeiLevenkov 使用&& 她也意味着bValid 无论如何都会被计算两次,除了第二个操作数可能被短路。
    • @RobertLevy 您尝试将第二个操作数短路导致您编写的代码强制评估该表达式,因为您已将其重构为一个变量。
    • @Servy 好点,但如果非易失性布尔变量(如在 OP 的示例中)的“评估两次”真的会导致任何变化...
    【解决方案3】:

    所以,首先,这里没有使用位运算符。 & 运算符有几个重载;它既有数字类型的许多位重载,也有布尔值的重载,它执行 逻辑 AND,根本不会短路。

    至于为什么代码作者没有使用&&= 运算符而不是&= 运算符,那是因为没有&&= 运算符,只有一个&=运算符。

    【讨论】:

      猜你喜欢
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2019-03-01
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多