【问题标题】:Can conditions with functions result in unreached code?带有函数的条件会导致代码未到达吗?
【发布时间】:2013-06-26 13:28:56
【问题描述】:

抱歉,我想不出更好的方法来表达我的问题,所以它可能是重复的。我提前道歉。通常我会自己测试,但我目前在无法编程的工作站上。

假设我们有以下代码

public void testFunctions()
{
    if(someFunction1() && someFunction2())
    {
        Console.WriteLine("I will never get here.");
    }
}

private bool someFunction1()
{
    Console.Write("Obviously I got here");
    return false;
}

private bool someFunction2()
{
    Console.WriteLine(", but will I ever get here?");
    return false;
}    

当我调用 testFunctions 时输出会是什么?

Obviously I got here

或者:

Obviously I got here, but will I ever get here?

【问题讨论】:

  • 在 C# 中,你会得到“显然我到了这里”并且永远不会达到第二个条件。这就是为什么如果您需要检查空值,您首先要执行此操作。但是,并非所有语言都如此。例如,Javascript 将同时运行这两种条件。
  • Javascript 会同时运行这两种情况吗?我对此表示高度怀疑。也许它甚至依赖于 js 引擎,但至少在 chrome(v8 引擎)中,如果第一个计算结果为 false,它确实 not&& 表达式中运行这两个函数。
  • 此外,据我所知,在 javascript 中它与在 C# 中完全相同 - 您也可以使用 & 运算符来始终运行表达式的两侧。

标签: c# if-statement unreachable-code


【解决方案1】:

我认为您基本上是在问&& 短路。确实如此 - 如果第一个操作数的计算结果为 false,则不计算第二个操作数。这是由语言规范保证的。来自 C# 5 规范的第 7.12 节:

&&|| 运算符是 &| 运算符的条件版本:

  • 操作x && y 对应于操作x & y,除了y 仅在x 不是false 时才被评估。
  • x || y 操作对应于x | y 操作,除了y 仅在x 不是true 时进行评估。

(为了完整起见,我包括了关于 || 的部分。)

【讨论】:

    【解决方案2】:

    将显示第一个(“显然我到了这里”)。由于您的第一个方法返回 false,因此不会评估 if 语句中的第二部分。如果它是一个 or 表达式,则将计算第二部分并将您的第二个输出显示到屏幕上。

    【讨论】:

      【解决方案3】:

      会的

      “显然我到了这里”

      为什么?

      这很简单:运算符 '&&' 要求两个结果都为真,才能返回真。如果第一个条件没有通过,则无需检查第二个条件。

      不过,运算符 '&' 的作用几乎相同,只是它调用了这两个函数。

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多