&=运算符等价
本文关键字:运算符 | 更新日期: 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();