我很好奇为什么逗号是一个快捷方式and
并不是andalso
在警卫测试中。
由于我称自己为“C 本地人”,所以我看不到短路布尔求值的任何缺点。
我使用编译了一些测试代码to_core
标记以查看实际生成的代码。使用逗号,我看到左边的值和右边的值都被评估并且都被与了。和andalso
你在 case 块中有一个 case 块,并且没有调用erlang:and/2
.
我没有做过基准测试,但我敢说andalso
变体是更快的一种。
深入研究过去:
最初在警卫中只有,
分开tests从左到右对它们进行评估,直到没有更多的测试并且警卫成功,或者测试失败并且警卫作为一个整体失败。之后;
添加是为了允许在同一条款中替代后卫。如果警卫评估双方,
在测试之前,有人就已经搞错了。 @Kay 的例子似乎暗示他们确实按照应有的方式从左到右。
布尔运算符直到很晚才被允许在守卫中使用。
and
, 和...一起or
, xor
and not
, 是一个布尔运算符,并非用于控制。他们都是strict并首先评估它们的参数,就像算术运算符一样+
, -
, *
和 '/'。 C 中也存在严格的布尔运算符。
短路情况control运营商andalso
and orelse
后来添加以简化一些代码。正如您所说,编译器确实将它们扩展为嵌套的case
表达式,因此使用它们不会带来性能提升,只是代码方便和清晰。这可以解释您看到的结果代码。
N.B.警卫中有tests而不是表达式。有一个微妙的差异,这意味着在使用时and
and andalso
相当于,
using orelse
不等于;
。这留给另一个问题。提示:一切都与失败有关。
So both and
and andalso
有他们的位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)