[英]Lazy Evaluation not so Lazy?
我一直聽說 C# 使用惰性求值。 因此,對於某些代碼,例如if (true || DoExpensiveOperation()
將返回true
而不執行DoExpensiveOperation()
。
在一次面試測試中,我看到了以下問題,
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));
}
它會打印多少次“argument is true!” 到屏幕上?
我會說7
是正確的答案。 現在,如果我堅持使用編譯器並運行它,它會打印10
次! 懶惰的評價到底哪里出錯了?
我一直聽說 C# 使用惰性求值。
這對我來說太模糊了,無法同意。 如果你說||
C# 中的&&
運算符是短路的,如果不能僅從第一個操作數確定總體結果,則僅評估第二個操作數,那么我同意它。 惰性求值是一個更廣泛的概念——例如,LINQ 查詢使用惰性(或延遲)求值,在使用結果之前實際上並不獲取任何數據。
您正在使用&
運算符,它不是短路的:
& 運算符會評估兩個運算符,而不管第一個運算符的值如何。
&&
運算符正在短路:
運算
x && y
對應於運算x & y
,只是如果x
為假,則不計算y
,因為無論y
的值是多少,AND 運算的結果都是假的。
在你的代碼中用&&
替換&
,你會看到“argument is true!” 打印 8 次(不是 7 - 再次計算您的評論)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.