3

C# では遅延評価が使用されているとよく耳にします。したがって、のような特定のコードでは、実行せずif (true || DoExpensiveOperation()に戻ります。trueDoExpensiveOperation()

面接試験で以下の質問を見ました。

static bool WriteIfTrue(bool argument)
{
    if (argument)
    {
        Console.WriteLine("argument is true!");
    }

    return argument;
}

static void Main()
{
    // 1              0                       0                 1
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) || WriteIfTrue(true));

    // 1               1                     0                      1
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));

    //  0                 0                  0                    0
    WriteIfTrue((WriteIfTrue(false) & WriteIfTrue(true)) & WriteIfTrue(false));

    // 1                1                      0                   1
    WriteIfTrue((WriteIfTrue(true) || WriteIfTrue(false)) & WriteIfTrue(true));
}

「議論は真です!」と何回出力するでしょうか。画面に?

と言う7のが正解です。コンパイラに固執して実行すると、10何度も出力されます! 遅延評価はどこでうまくいかなかったのですか?

4

1 に答える 1

41

C# では遅延評価が使用されているとよく耳にします。

それは私が同意するにはあまりにも漠然としたコメントです. ||C# のand&&演算子は短絡的であり、最初のオペランドだけでは全体的な結果を判断できない場合にのみ 2 番目のオペランドを評価すると言った場合、私はそれに同意します。遅延評価はより広範な概念です。たとえば、LINQ クエリは遅延 (遅延) 評価を使用し、結果が使用されるまで実際にはデータをフェッチしません。

ショートサーキットではない&operatorを使用しています。

& 演算子は、最初の演算子の値に関係なく、両方の演算子を評価します。

&&オペレーター 短絡しています:

この操作は、 is の値が何であっても AND 操作の結果が false であるため、 if is falseが評価されないことを除いてx && y、操作に対応します。x & yxyy

コード内のあらゆる場所に置き換える&&&、「引数は true です!」と表示されます。8回印刷されました(7回ではありません-コメントをもう一度数えてください)。

于 2012-10-28T09:34:26.660 に答える