我一直聽說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));
}
多少次將其打印「的說法是真的!」到屏幕?
我會說7
是正確的答案。現在,如果我堅持進入編譯器並運行它,它會打印它10
次!懶惰評估全都出錯了?
那些是&& &&操作員嗎? – Dialecticus
這不是懶惰的評估,它是短路。此外,您正在將位運算符('&')與邏輯運算符('||')混合。 –