-1

次のようなメソッドに if ステートメントがあるとします。

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

foo()内部でコードを実行するかどうかを評価する前に、両方bar()とも完全に処理されますか、それとも if の 1 つの条件が満たされるとすぐに処理されますか?

私が質問する理由は、foo()およびbar()メソッドに相当するものはかなり計算コストの高い関数であり、foo()単独で if 条件を満たしている場合は を実行したくないからですbar()。そのため、私の現在のコードは次の行に沿っています。

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

これは必要ですか、または論理 OR で区切られた関数は必須として動作しますか?

4

3 に答える 3

7

&&||は、私の知る限り 3 つの言語すべてで短絡foo()しているため、 が に評価された場合truebar()は呼び出されません。

5.15 論理 OR 演算子 [expr.log.or]

1) || 演算子グループは左から右へ。オペランドは両方とも文脈上 bool に変換されます (条項 4)。オペランドのいずれかが true の場合は true を返し、それ以外の場合は false を返します。とは異なり|||左から右への評価が保証されます。さらに、最初のオペランドが に評価される場合、2 番目のオペランドは評価されませんtrue。(私のものを強調)

于 2012-10-23T09:37:26.773 に答える
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

つまり、最初の評価が真の場合、2 番目の評価には進まず、左から右に進みます。

-マイルド

于 2012-10-23T09:48:14.450 に答える
1

いずれかが真である場合、それ以上先に進むことはありません。それはShort Circuit Evaluationと呼ばれます。

iffoo()が true に解決されると、次のメソッドbar()は if ステートメントで実行されません。条件は true に解決されます。

||チェック|| オペレーター (C# リファレンス) - MSDN

操作

x || y

運用に対応

x | y

ただし、x が true の場合、y の値に関係なく OR 演算が true であるため、y は評価されません。この概念は、 「短絡」評価として知られています。

于 2012-10-23T09:37:24.607 に答える