【问题标题】:short circuit sequential logic in C#C#中的短路时序逻辑
【发布时间】:2019-12-06 07:17:32
【问题描述】:

在一些 C# 代码中,当我将代码从 PowerShell 移动到 C# 时,我正在评估一些逻辑,并遇到了这些差异。

    var a = false && false || true; // answer is true
    var a = true || false && false; // answer is true

然而在 PowerShell 中,同样的逻辑:

$false -and $false -or $true # result is true
$true -or $false -and $false # result is false

在 c# 中,第二行对我来说确实是错误的。有没有解释,那怎么解释PowerShell的逻辑不一样呢?

【问题讨论】:

  • 它们不是一回事。 [grin] powershell 代码评估第一个 2 项然后评估第三项的结果。如果你用括号使序列更明显,那就更清楚了>>> ($false -and $false) -or $true
  • @Lee_Dailey,当然,当你使用括号时,一切都会更清楚......但既然你不应该这样做,当你和编译器都同意操作顺序时,我试图理解这种逻辑短路的操作顺序,我真的很困惑,像 PowerShell 这样的东西不会用它所写的语言来效仿。
  • 根据本页>>> C# 操作符 - C# 参考 | Microsoft Docs — docs.microsoft.com/en-us/dotnet/csharp/language-reference/… && 的优先级高于 ||。 PoSh 运营商没有这样的优先级。它们从左到右进行评估...

标签: c# powershell


【解决方案1】:

这是运算符优先级的问题;在 C# logical AND is higher precedence than Logical OR 中,这意味着 && 它在 || 之前被评估,无论它在表达式中的什么位置。 (除非添加了括号)。

在 PowerShell 中,-and -or -xor have the same precedence 所以:

当运算符具有相同的优先级时,PowerShell 会在它们出现在表达式中时从左到右计算它们

至于为什么不同,我不知道。

注意,这不是短路,而是进行部分计算,然后意识到结果已经确定,然后跳过其余的计算。短路不会改变结果,只会更快地到达那里。见this related question about C# && and || operator precedence

【讨论】:

  • 有趣的是,其他消息来源表明条件运算符的优先级都是相等的,我认为相等更有意义,但我也确信这来自 C/C++。跨度>
  • 查看此页面,docs.microsoft.com/en-us/dotnet/csharp/language-reference/…,看起来这种情况与优先级无关,完全与短路有关。 && 永远不会被评估。
  • @msftrncs 去掉短路机制,每次都评估整个表达式,没有任何变化。因此,这与短路无关。答案在 C# 中让您感到惊讶的原因是它首先在右侧评估 &&,而不是左右工作。因此,这都是关于逻辑运算符的优先级,这在两种语言中是不同的。短路在两种语言中(我认为)是相同的,因此这是它无法解释差异的另一个原因。
【解决方案2】:

所以从长远来看,优先权的整体情况非常混乱。

因为 && 在这里具有更高的优先级,所以可以重写表达式以便人类开始理解它:

true || (anything && anything)

但在这一点上,答案立即可用,TRUE 或 anything 为 TRUE,因此代码根本不需要执行 AND 部分,因此不会因为短路.

另一方面,PowerShell 必须对它们一视同仁(实际上是(($true -or <any>) -and $false),在这种情况下必须评估操作数 1 和操作数 3,并且从不接触操作数 2,因为在操作数 1 返回 TRUE 之后,无需检查操作数 2。

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2013-10-18
    • 2015-04-11
    • 2010-12-18
    • 2016-06-25
    • 2012-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多