【问题标题】:What happens if the first part of an if-structure is false?如果 if 结构的第一部分为假怎么办?
【发布时间】:2014-11-11 19:28:39
【问题描述】:

我想知道当程序处理具有多个条件的 if 结构时会发生什么。我有一个想法,但我不确定。我举个例子:

List<string> myTestList = null;
if (myTestList != null && myTestList.Count > 0)
{
    //process
}

列表为空。处理 if 语句时,是否会从左向右退出 if 一个条件为假?

我已经尝试过了,似乎没有抛出任何错误,所以我假设上面解释了它,但我不确定。

【问题讨论】:

  • 当您添加else 子句时,您看到发生了什么?
  • 它被调用了,这就是为什么我认为一旦条件为假 if 就会崩溃
  • “崩溃”? “崩溃”是什么意思?
  • 崩溃我的意思是逃跑/退出/离开结构
  • 如前所述,这是“短路评估”。我想补充一点,这是“懒惰评估”的一个特例。非惰性 Java 以外的其他语言(例如 Haskell)比仅对布尔表达式进行更多的优化。不幸的是,许多开发人员甚至教师和讲师都知道惰性求值,但在这种特殊情况下,当涉及到布尔表达式时,他们不知道或不提及短路求值。但是这里的所有专业人士和书呆子都立即给了你正确的提示;-)

标签: c# if-statement


【解决方案1】:

重要的是&amp;&amp;。这是短路,因此永远不会评估 Count;从左到右评估条件。

还有一个非短路操作符 (&amp;),但在 if 测试中非常很少见;它主要用于按位运算(int 等)。

来自规范:

条件逻辑运算符

&amp;&amp;|| 运算符称为条件逻辑运算符。 它们也被称为 “短路”逻辑运算符。

...

&amp;&amp;|| 运算符是 &amp;| 的条件版本 运营商:

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

【讨论】:

    【解决方案2】:

    在大多数(但不是全部)现代语言中,有一个称为"short circuit boolean evaluation" 的功能。这意味着如果&amp;&amp; 条件的第一部分为假,则根本不计算第二部分。

    类似的功能适用于||,如果第一部分为 true,则不评估第二部分。

    请注意,此功能不限于if 语句。以下也是有效的,如果myTestListnull,则不会尝试引用Count

    bool b = myTestList != null && myTestList.Count > 0;
    

    【讨论】:

      【解决方案3】:

      短路了。

      a && b
      

      如果a 为假,则不会评估b。我们可以使用这种行为,因为表达式总是错误的。

      同样,

      a || b
      

      如果a 为真,则不会评估b

      【讨论】:

        【解决方案4】:

        在 C# 和大多数语言中,&amp;&amp;||短路,即如果表达式的第一部分足以确定结果,则第二部分是 保证不会被执行。

        您使用的代码是惯用的 C# 代码。

        【讨论】:

          【解决方案5】:

          如果引用为null,评估将立即停止。这称为逻辑表达式短路评估 - 如果 &amp;&amp; 的左侧部分是 false,则根本不评估右侧部分。

          【讨论】:

            【解决方案6】:

            大多数现代编程语言(包括 C#)都实现了所谓的 McCarthy 的顺序连接运算符。这意味着:

            a && b <=> a ? b : false
            

            如果您查看这两个等效表达式中的第二个,很明显当且仅当a 为真时,才会评估b。反过来:

            a || b <=> a ? true : b
            

            【讨论】:

              【解决方案7】:

              是的,应该使用短路评估。我自己不是 C# 开发人员,但我是从 this Wikipedia article 读到的。

              【讨论】:

                【解决方案8】:

                对于以下示例程序:

                无效测试() { 布尔 f1 = 0; 布尔 f2 = 0;

                如果 (f2 && (f1 = 1)) { cout

                如果 ((f1 = 1) && f2) { cout

                输出将是: F1 0 : F2 : 0

                F1 1 : F2 : 0

                这基本上表明 if 循环是从左到右执行的。 1. 在第一个 if 循环中,第一个条件失败,它不费心去测试第二部分。 2.在第二个if循环中,先运行第一部分,再运行第二部分。

                这适用于 C++。希望这会有所帮助。

                • 伊瓦尔

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-31
                  • 2012-09-13
                  • 2016-11-10
                  • 1970-01-01
                  • 2014-06-13
                  相关资源
                  最近更新 更多