准备包含条件的语法树的最佳方法是什么,以便轻松快速short curcuit
使用?
short circuit
的规则一般都很简单:
and
块中的一个组件返回false,则完整块将返回false并且可以退出执行or
块中的一个组件返回true,则完整块将返回true并且可以退出执行因此,例如,这个简单的语句将被评估为以下语法树1 = 0 and 1 = 1
:
and
/ \
= =
/ \ / \
1 0 1 1
在这种情况下很容易。执行树的第一部分(分支)后, 执行将退出它只能返回false。但如果树变得更多 复杂,必须有一种更有效率的方法。或者这已经是最多了 有效的方式?
例如,在这种情况下,c#
编译器如何评估语法树?
修改
我是否应该在一个简单的列表中写下所有条件,如果true
或false
不可能,则分支到最后?那么我最后没有and
和or
部分?
非常感谢你!
答案 0 :(得分:2)
您对短路的定义与C#和其他语言的定义不完全相同。在大多数(可能是所有)短路的语言中,行为仅取决于左操作数的值,即:
left && right
始终评估left
,仅在right
为真时评估left
。
left || right
始终评估left
,仅在right
为假时评估left
。
因此语言规则保证您永远不会首先尝试正确的操作数,即使编译器可能认为首先尝试正确的操作数会更有效。这样你知道list == null || list.IsEmpty()
不能抛出空指针异常。
因此,为了回答你的问题,编译器不会生成比“评估左操作数更有效的东西,然后仅在必须时评估正确的操作数”,因为其他任何东西都会违反语言规则。
PS:从理论上讲,编译器可以重新排序操作数,如果它可以证明它们没有任何副作用,但据我所知,这是没有完成的。无论哪种方式都不会发生在AST级别。PPS:C#编译器不评估AST,它从中生成代码。它是一个编译器,而不是一个解释器。