【发布时间】:2016-09-16 14:00:59
【问题描述】:
假设你有
class Program
{
static void Main()
{
bool a = GetFalse();
if (a)
{
a = GetTrue();
}
bool b = GetFalse();
b &= GetTrue();
}
static bool GetFalse() => (false);
static bool GetTrue() => (true);
}
b 已经为 false 时,为什么还要执行 GetTrue()?
&= 运算符不应该认识到它永远无法评估为真吗?
【问题讨论】:
-
否 -
&=运算符等效于x = x & y并且不会短路。 -
一个更简单的解释是 & 是一个按位运算符,并且要执行按位运算,您需要两个操作数的二进制值,因此即使第一个为 false,您也需要执行第二部分。
-
@zoubida13
&只是整数类型的按位运算符 - 它们都是布尔类型的布尔运算符。 -
@DStanley 这就是我 [可能不太好] 想说的。要应用按位运算(即逐位),它需要预先处理两个操作数,并在必要时转换整数类型。 && 是 c# 中的逻辑运算符,不是按位的,它将取操作数 1 的布尔值,然后决定继续处理操作数 2 的布尔值。虽然我承认我们可能在这里争论语义。
-
这不是语义。
&是布尔类型的非短路 logical 运算符。有一个普遍的误解,认为&是按位的,&&是逻辑的。对于布尔类型,它们都合乎逻辑;唯一的区别是一个短路,一个不短路。
标签: c# boolean-logic boolean-operations