为什么_ret的值为真,它的值不应该为假(位操作符)

本文关键字:位操作 不应该 操作符 ret 为什么 | 更新日期: 2023-09-27 18:03:28

class Program
{
    private static bool _ret = true;
    static void Main()
    {
        _ret &= Method();
        Console.WriteLine(_ret);
        Console.Read();
    }
    private static bool Method()
    {
        _ret &= false;
        return true;
    }
}

我们在开发的一个更大的应用程序中遇到了这个问题,想知道它是否符合预期的功能?这是用c#和Visual Studio 2010编写的

为什么_ret的值为真,它的值不应该为假(位操作符)

正如Eric Lippert在他的博客文章"Precedence vs Associativity vs Order"中所解释的,

表达式F() + G() * H()等价于F() + (G() * H()),但是c#不会在F()之前计算G() * H()。相反,这是等价的:

temp1 = F();

temp2 = G();

temp3 = H();

temp4 = temp2 * temp3;

result = temp1 + temp4;

所以在你的例子中,它在调用Method()之前求值_ret,并且_ret在Method()内部改变并不影响外部调用。

见:http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx

我打赌_ret &= Method()被翻译成_ret = _ret &Method()和RHS上的_ret在调用Method()之前被求值。

由于_ret最初为true,当它在RHS中计算_ret时为true,然后在Method()中将_ret更改为false,但这无关紧要,因为Method()返回true和true &True = True

这可能是编译器/环境特定的…它依赖于从左到右的求值,你不应该指望它

你的方法返回值应该如下

    private static bool Method() 
    {
        return _ret &= false; 
    }