【问题标题】:The &= Operator Equivalent&= 运算符等效项
【发布时间】:2014-08-21 19:49:22
【问题描述】:

考虑以下代码:

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 &amp;= returnFalse(); 编译为result = result &amp; returnFalse(); 而不是result = result &amp;&amp; returnFalse();(我希望是后者)。

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

我希望它会反过来。我们都使用&amp;&amp; 运算符比&amp; 运算符更常用,我希望它是“默认行为”。


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

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

【问题讨论】:

  • 在这种情况下大概会被称为 &&=。
  • @MarkPattison 也想过,正在谷歌上搜索该运算符是否存在,我只是不知道。
  • 这是你的看法。正如我们所知,x+=y 意味着 = x+y,我个人习惯于这种看法。因此对于 x &= y 我会期望 x = x & y
  • 为什么你会期望只使用一个&amp; 的复合赋值运算符等同于使用&amp;&amp; 而不是&amp;?这对我来说似乎是一个奇怪的期望。

标签: c#


【解决方案1】:

您遇到的困惑是,当您在数值上使用 &amp;&amp;&amp; 时存在差异,但在字节上下文中的布尔值上使用时却没有差异。

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

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

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

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

在使用&amp;= 时会使用短路的假设并不容易理解。 &amp;&amp;&amp; 更常用的论点在这里找不到位置。因为&amp; 是按位逻辑运算符,而&amp;&amp; 是逻辑运算符。所以自然而然&amp;= 就是这个意思。

【讨论】:

  • 感谢您的回答。清晰且解释清楚。
【解决方案2】:

您收到“已执行”消息是因为

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

还有这个

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

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

你写的二进制&amp;的代码其实已经转换成你期望的样子了:

result &= returnFalse(); 

result = result &  returnFalse();

但问题是,如果您不检查result,而是检查funcExceuted。 将其更改为result,您将从代码中获得预期的行为。

怎么样

这是为什么?

C# 语言语法,同理

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

【讨论】:

  • 他不是问为什么结果是这样,而是想知道是否有var a = a &amp;&amp; b 的简写,或者为什么&amp;= 的结果是a &amp; b 而不是a &amp;&amp; b
  • @germi:他在问为什么代码没有打印“未执行”,答案是:代码检查错误的变量。
  • @Tigran 他预计函数根本不会执行,因为result &amp;&amp; returnFalse() 会缩短 cicruit 因为result 开始于false
  • @Rotem:但他写的是 & 而不是 &&。他知道什么是 & 什么是 && 并且知道它们之间的区别,但是谁期望 x&=y 等于 x = x&&y,所以我的回答too解决了这个问题。
  • @Tigran 我想这里唯一真正的问题是'C# 中是否有&amp;&amp;= 运算符'。
【解决方案3】:

&amp;&amp;&amp; 之间的主要区别之一是&amp;&amp; 是短路的,而&amp; 总是计算两个操作数。

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

【讨论】:

  • 感谢您的回答。我知道这一点。正如我所写,我预计它相当于result = result &amp;&amp; returnFalse();
  • 如果你知道,为什么要问这个问题?还是您希望这里有人能与 C# 之神交流?
  • @david.pfx 抱歉打错了。我的意思是result = result &amp;&amp; returnFalse(); - 评论已更新。问题是为什么会这样。
猜你喜欢
  • 2014-10-02
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多