【问题标题】:C# Why is a &= SomeFunction() executed if a == false? [duplicate]C# 为什么如果 a == false 会执行 &= SomeFunction()? [复制]
【发布时间】:2016-09-16 14:00:59
【问题描述】:

假设你有

class Program
{
    static void Main()
    {
        bool a = GetFalse();
        if (a)
        {
            a = GetTrue();
        }

        bool b = GetFalse();
        b &= GetTrue();
    }

    static bool GetFalse() => (false);

    static bool GetTrue() => (true);
}

b 已经为 false 时,为什么还要执行 GetTrue()

&= 运算符不应该认识到它永远无法评估为真吗?

【问题讨论】:

  • 否 - &= 运算符等效于 x = x & y 并且不会短路。
  • 一个更简单的解释是 & 是一个按位运算符,并且要执行按位运算,您需要两个操作数的二进制值,因此即使第一个为 false,您也需要执行第二部分。
  • @zoubida13 &只是整数类型的按位运算符 - 它们都是布尔类型的布尔运算符。
  • @DStanley 这就是我 [可能不太好] 想说的。要应用按位运算(即逐位),它需要预先处理两个操作数,并在必要时转换整数类型。 && 是 c# 中的逻辑运算符,不是按位的,它将取操作数 1 的布尔值,然后决定继续处理操作数 2 的布尔值。虽然我承认我们可能在这里争论语义。
  • 这不是语义。 & 是布尔类型的非短路 logical 运算符。有一个普遍的误解,认为& 是按位的,&& 是逻辑的。对于布尔类型,它们合乎逻辑;唯一的区别是一个短路,一个不短路。

标签: c# boolean-logic boolean-operations


【解决方案1】:

因为x &= y 只是x = x & y 的简写。 & 没有短路,因此无论x 的值如何,都会评估y,即使对于布尔值也是如此。

对于布尔值,具体来说,& 的短路版本:&&。但是,没有&&= 运算符,因此您需要单独执行:

b = b && GetTrue();

【讨论】:

  • 是否有短路等效物?
  • @roryap 不在一个运营商中 - 您必须使用 x = x && y
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
相关资源
最近更新 更多