【问题标题】:Do all logical OR separated checks in an if get processed prior to execution of the code within?是否在执行代码之前处理 if 中的所有逻辑或分隔检查?
【发布时间】:2012-10-23 09:36:22
【问题描述】:

假设我在这样的方法中有一个 if 语句:

if ( foo() || bar() ) {
    return true;
}

foo()bar() 是否都会在评估是否在其中执行代码之前或在一个条件满足 if 时立即处理?

我问的原因是我的 foo()bar() 方法的等价物是计算量相当大的函数,如果 foo() 单独满足 if 条件我不想执行 bar()。因此,我当前的代码如下:

if ( foo() ) {
    return true;
}
if ( bar() ) {
    return true;
}

这是必要的,还是逻辑 OR 分隔的函数会表现为要求?

【问题讨论】:

  • 解释反对票的评论会很好 - 我的问题真的不清楚还是没有用?我不知道短路,当然这个问题对同样不知道的其他人来说是有用的。

标签: c# java c++ if-statement logical-operators


【解决方案1】:

&&|| 在所有 3 种语言 AFAIK 中都是短路,所以如果 foo() 的计算结果为 truebar() 将不会被调用。

5.15 逻辑或运算符 [expr.log.or]

1) ||运算符组从左到右。操作数都根据上下文转换为 bool(第 4 条)。它 如果任一操作数为真,则返回真,否则返回假。与| 不同,|| 保证从左到右 评估;此外,如果第一个操作数的计算结果为true,则不计算第二个操作数。 (强调我的)

【讨论】:

  • 很好的答案,短路是我所追求的 - 就在我的舌尖上,谢谢。
【解决方案2】:

如果其中任何一个为真,则不会继续进行。即致电Short Circuit Evaluation

如果foo() 解析为true,则不会在if 语句中执行下一个方法bar()。条件将解析为真。

查看|| Operator (C# Reference) - MSDN

操作

x || y

对应操作

x | y

除非 x 为真,否则不会计算 y,因为 OR 操作 无论 y 的值如何,都为真。这个概念被称为 “短路”评估

【讨论】:

    【解决方案3】:

    我有点好奇,写了一个小程序来确定会发生什么。

    class Program
        {
            static void Main(string[] args)
            {
    
                if (foo() || bar())
                {
                    Console.WriteLine("Either Foo or Bar returned true");
                }
                Console.ReadKey();
            }
            public static bool foo()
            {
                Console.WriteLine("I am in Foo");
                return true;
            }
            public static bool bar()
            {
                Console.WriteLine("I am in Bar");
                return false;
            }
    
        }
    

    这刚刚返回

    I am in Foo
    Either Foo or Bar returned true
    

    意思是,如果第一次评估为真,则不会进行第二次评估,而是从左到右。

    -温和

    【讨论】:

    • 仅供参考,测试并不总是有效。 (作为实验,还可以)
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2019-01-19
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多