-1

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

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

在评估是否在其中执行代码之前,或者在一个条件满足 if 时,是否会完全处理两者foo()和两者?bar()

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

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

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

4

3 回答 3

7

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

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

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

于 2012-10-23T09:37:26.773 回答
1

如果其中任何一个为真,则不会继续进行。这就是所谓的短路评估

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

检查|| 运算符(C# 参考)- MSDN

操作

x || y

对应操作

x | y

除了如果 x 为真,则不计算 y,因为无论 y 的值如何,OR 运算都是真。这个概念被称为 “短路”评估

于 2012-10-23T09:37:24.607 回答
1

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

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

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

-米林德

于 2012-10-23T09:48:14.450 回答