&&= 在 C# 中? (布尔表达式)[重复]

Posted

技术标签:

【中文标题】&&= 在 C# 中? (布尔表达式)[重复]【英文标题】:&&= in C#? (boolean expression) [duplicate] 【发布时间】:2012-05-17 19:18:04 【问题描述】:

可能重复:Why are there no ||= or &&= operators?

今天偶然发现

 a &= GetBool();

不一样

 a = a && GetBool();

我一定误解了很多年。在第一个示例中,即使“a”为假,也会执行“GetBool()”。在第二个中,它不是。

有什么可以在 C# 中实现类似“&&=”的东西吗?

【问题讨论】:

@Soohjun:应该是false 而不是true 我相信 Eric 在博客上写过为什么 &&= 不可用.....啊,这里是 blogs.msdn.com/b/ericlippert/archive/2012/04/19/… 见this answer by Eric Lippert。 @HenkHolterman:当类型为位/布尔时,位和布尔完全相同。 @HenkHolterman:我想我对自己的 cmets 感到困惑。删除:) 【参考方案1】:

有什么可以在 C# 中实现类似“&&=”的东西吗?

嗯,你可以写

a = a && getBool();

相反...老实说,我想不出很多我真的想要做任何不同的事情。即使是上面的也很少见,IME。

没有为&&||?? 定义复合赋值运算符(它们是明显的“短路”运算符)。有关复合赋值运算符的完整列表,请参阅 C# 4 规范的第 7.17 节,有关确切复合赋值作用的更多详细信息,请参阅第 7.17.2 节。

【讨论】:

【参考方案2】:

来自documentation:

使用 &= 赋值运算符的表达式,例如

x &= y

等价于

x = x & y

除了 x 只计算一次。 & 运算符执行 整数操作数的按位逻辑与运算和逻辑与运算 布尔操作数。

我想说,为了避免在不必要时评估 y,请使用

x = x && y

为了避免对 x 进行两次评估(无论这意味着什么),请使用

x &= y

你不能将两者结合起来。

微优化(至少对于理论上的情况),它将是:

if (x) x = y;

如果 x 已经是 false,则无需执行任何操作。

【讨论】:

“评估一次”用于更复杂的情况,例如如果您有x[i+3] = x[i+3] & y; 那么i+3 显然会计算两次! @Mr Lister:这是有道理的,我没有考虑到这一点。还有一些属性,您可以在其中使用 &= 运算符,它可能具有任意复杂的实现(如果这是一个好的设计除外)。

以上是关于&&= 在 C# 中? (布尔表达式)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C# LINQ to Entities 无法识别方法“布尔”

如何简化任意布尔表达式?

在 C# 中对布尔值使用 &=

javaScript 中的布尔运算符 && 和 ||

JS 中的布尔运算符 && 和 ||

ValueError 1:无法将列转换为布尔值:请使用 '&' 表示 'and'、'|' for 'or', '~' for 'not' 在构建 DataFrame 布尔表达式时