&=运算符等价

本文关键字:运算符 | 更新日期: 2023-09-27 18:11:08

考虑以下代码:

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();(我期望是后者)。

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

我希望情况正好相反。我们都使用&&运算符比&运算符更常见,我希望它是"默认行为"。


更新:大多数答案似乎都回答错了问题。我知道&&&之间的区别在于&&是短路的,而&总是计算两个操作数。

问题是为什么a &= b翻译成a = a & b;而不是a = a && b;

&=运算符等价

您失败的困惑是,当您在数值上使用&&&时存在差异,但当您在字节上下文中使用它时没有。

唯一的区别是,当你使用&&时,你会得到短路。

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

结果无差异。唯一的区别是CPU将如何处理它。

在这种情况下,当你使用&=运算符布尔等于使用result = value & value

当您使用&=时,将使用短路的假设并不容易理解。关于&&&使用得更频繁的争论在这里找不到位置。因为&是位逻辑运算符,而&&是逻辑运算符。因此,&=的含义是很自然的。

您收到"已执行"消息是因为

Func<bool> returnFalse = () =>
{
    funcExecuted = true; //THIS !!!!!!
    return false; 
};

和this

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

funcExceuted总是(在提供的代码范围内)true

你写的二进制&代码实际上被转换成你期望的:

result &= returnFalse(); 

result = result &  returnFalse();

,但问题是,在一个条件下,你不检查result,但funcExceuted。将其更改为result,您将从代码中获得预期的行为。

为什么?

它是C#语言语法,出于同样的原因

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

&&&之间的一个关键区别是&&是短路的,而&总是计算两个操作数。

result &= returnFalse();等于result = result & returnFalse();