& =运算符等效

时间:2014-07-01 09:41:56

标签: c#

请考虑以下代码:

bool funcExecuted = false;
bool result = false;
Func<bool> returnFalse = () =>
{
    funcExecuted = true;
    return false; 
};
result &= returnFalse();

string msg = funcExecuted?"Executed":"Not Executed";
Console.WriteLine(msg);

预期结果:

  • 我希望收到Not Executed
  • 的消息

实际结果:

  • 我收到了Executed消息。

结论:

result &= returnFalse();编译为result = result & returnFalse();而非result = result && returnFalse();(我预计后者)。

我的问题是,为什么会这样?

我希望它是另一种方式。我们都比&&运算符更常用&运算符,我希望它是&#34;默认行为&#34;。


更新 大多数答案似乎回答了错误的问题 我知道&&&之间的差异是&&是短路的,而&总是评估两个操作数。

问题是为什么a &= b会转换为a = a & b;而不是a = a && b;

3 个答案:

答案 0 :(得分:2)

您遇到的困惑是,当您对数字值使用&&&时有所不同,但在字节上下文中使用布尔值时却没有。

然后唯一不同的是,当你使用&&时,你会得到短路。

boolean result = false  & true; //bitwise AND
boolean result = false && true; //logical AND

结果没有区别。那么唯一不同的是CPU将如何处理它。

在这种情况下,当您使用运算符&=作为布尔值时,它等于使用result = value & value

使用&=时将使用短路的假设并不容易理解。 &&使用频率高于&的论点在此处找不到。因为&是按位逻辑运算符,&&是逻辑运算符。因此&=意味着它的意思是很自然的。

答案 1 :(得分:1)

由于

,您收到了“已执行”讯息
Func<bool> returnFalse = () =>
{
    funcExecuted = true; //THIS !!!!!!
    return false; 
};

和这个

string msg = funcExecuted?"Executed":"Not Executed";

funcExceuted始终(在提供的代码范围内)true

您编写的二进制&代码实际上已转换为您期望的内容:

result &= returnFalse(); 

result = result &  returnFalse();

但事情是,条件是你不检查result,而是检查funcExceuted。 将其更改为result,您将从代码中获得预期的行为。

怎么样?
  

为什么会这样?

它是C#语言语法,对于相同的共振

left+=right已转换为left = left + right

答案 2 :(得分:0)

&&&之间的主要区别之一是&&是短路的,而&总是评估两个操作数。

result &= returnFalse();result = result & returnFalse();等效。