请考虑以下代码:
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;
答案 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();
等效。