【发布时间】:2012-10-28 09:30:51
【问题描述】:
我一直听说 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# lazy-evaluation