为什么_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编写的
正如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;
}