【问题标题】:Is it ok to use bitwise operator in place of a logical operator like OR可以使用按位运算符代替 OR 之类的逻辑运算符吗
【发布时间】:2014-10-25 11:07:56
【问题描述】:

这可能很愚蠢。但我有一个简单的疑问 假设我在函数中有以下检查

bool Validate(string a , string b)
{
    if(a == null || b == null)
    {
        throw new NullReferenceException();
    }
    else
    {
    }
}

如下所示,是否可以使用按位或进行验证

if(a == null | b == null)

【问题讨论】:

  • 你试过了吗?我不确定这在编译时是否有任何区别
  • 是的,它有效。但不确定它是否正确
  • 当与 bool 值一起使用时,| 不是位运算符 - 参见。 docs: "对于 bool 操作数,| 计算其操作数的逻辑 OR"
  • |& 不要短路。
  • @O.R.Mapper 哦,谢谢..我不知道。现在知道了

标签: c# logical-operators


【解决方案1】:

在布尔表达式(而不是整数等)中,主要区别在于:短路。 || 短路。 | 没有。在大多数情况下,您想要短路,因此|| 更为常见。在你的情况下,这无关紧要,所以|| 应该被用作更值得期待的选择。

重要的时间是:

if(politics.IsCeasefire() | army.LaunchTheRockets()) {
    // ...
}

对比:

if(politics.IsCeasefire() || army.LaunchTheRockets()) {
    // ...
}

第一个总是两者都做(假设没有抛出异常);如果要求停火,第二个不会发射火箭。

【讨论】:

  • 火箭是有史以来最好的副作用例子 :)
  • 就个人而言,在这种情况下,我更喜欢if(!politics.IsCeasefire()){army.LaunchTheRockets();}。排除诸如记忆之类的东西,我不喜欢隐藏条件句的副作用。
  • @Brian 不要把逻辑带入火箭发射战斗!
【解决方案2】:

在这种情况下(带有bool 参数)| 运算符不是位运算符。它只是逻辑or(||) 的非短路版本。

&&& 也是如此 - 它只是逻辑 and 的非短路版本。

可以通过副作用看到差异,例如

bool Check()
{
    Console.WriteLine("Evaluated!");
    return true;
}

// Short-circuits, only evaluates the left argument.
if (Check() || Check()) { ... }

// vs.

// No short circuit, evaluates both.
if (Check() | Check()) { ... }

【讨论】:

    【解决方案3】:

    这应该可行,因为当用于评估为bool 的事物时,“按位”运算符执行的逻辑运算完全相同。不过,您可能会发现它的效率较低。 C# 中的逻辑运算符将短路,这意味着如果可以从第一个表达式推导出答案,它们将跳过对第二个表达式的求值。所以在你的例子中,如果a == null 被证明是真的,那么|| 会立即返回true,而| 会继续检查b == null

    【讨论】:

      【解决方案4】:

      正如已经评论的那样,代码确实“ok”。

      使用单管道“|”将在返回结果之前评估所有表达式。 '||'可以更有效,因为一旦表达式的计算结果为真,它就会停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-06
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 2020-01-23
        • 2015-04-27
        相关资源
        最近更新 更多