我一直听说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
这不是懒惰的评估,它是短路。此外,您正在将位运算符('&')与逻辑运算符('||')混合。 –