当前位置:  开发笔记 > 编程语言 > 正文

所有编程语言都有布尔短路评估吗?

如何解决《所有编程语言都有布尔短路评估吗?》经验,为你挑选了7个好方法。

在PHP代码中

if(a() && b())

当第一个操作数求值时false,b()将不会被求值.

同样地,在

if (a() || b())

当第一个操作数计算到true,b()将不会被评估..

这适用于所有语言,如Java,C#等吗?

这是我们使用的测试代码.


Patrick McDo.. 66

这称为短路评估.

对于从C(C,C++,Java,C#)派生的语言通常都是如此,但对于所有语言都不是这样.

例如,VB6不会这样做,也不是在早期版本的VB.NET中完成的.VB8(在Visual Studio 2005中)为此目的引入了AndAlso和OrElse运算符.

此外,从评论来看,似乎csh从右到左执行短路评估,使问题更加令人困惑.

还应该指出的是,短路评估(或缺乏)有可能需要注意的危险.例如,如果第二个操作数是一个具有任何副作用的函数,则代码可能无法完全按照程序员的意图执行.



1> Patrick McDo..:

这称为短路评估.

对于从C(C,C++,Java,C#)派生的语言通常都是如此,但对于所有语言都不是这样.

例如,VB6不会这样做,也不是在早期版本的VB.NET中完成的.VB8(在Visual Studio 2005中)为此目的引入了AndAlso和OrElse运算符.

此外,从评论来看,似乎csh从右到左执行短路评估,使问题更加令人困惑.

还应该指出的是,短路评估(或缺乏)有可能需要注意的危险.例如,如果第二个操作数是一个具有任何副作用的函数,则代码可能无法完全按照程序员的意图执行.


VB:"亲爱的,这样做也是这样的,也是这个*OrElse*!"
不要忘记VB.NET OrElse运算符!

2> Alex Warren..:

对于VB6来说并非如此.

在VB.net中,如果您希望它跳过评估第二个表达式,则必须使用"AndAlso"而不是"And".


同样,短路"Or"是"OrElse".我喜欢哪个.这是VB的"按我的方式行事,OrElse!"

3> Marc Gravell..:

是否适用于所有语言,如JAVA,C#等?

在C#中,这仅适用于短路运营商' ||'和' &&'; 如果您只是使用' |'或' &',它将每次评估双方.


与C和C++相同.但是,他们并没有做同样的事情.在C中,2 && 1的计算结果为1(相当于true),而2和1的计算结果为+,并且计算结果为0.对于需要&&和||的布尔操作数的语言,这并不明显.
Java具有相同的非短路运算符.
正如大卫所说,| 和&不是布尔运算符,因此短路对它们没有意义 - 除非有某种方法可以进行位级短路.

4> waxwing..:

它被称为短路评估,大多数语言都是这样做的.在某些语言中,存在不执行此操作的运算符.



5> 小智..:

Pascal的原始版本没有,这引起了很多悲伤.现代帕斯卡,如德尔福的工作方式与C等人相同.



6> Mark Harriso..:

Ada有特殊的短路形式的条件:

and then
or else

像这样使用:

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y

在某些方面它有点好,因为你可以推断程序员知道需要短路的表达式,并且条件不是偶然的.



7> Pascal MARTI..:

对于C语言的"孩子"语言来说确实如此:PHP,Java,C++,C#,......或者像Perl一样的"灵感".

但对于VB来说却不是这样(至少在.NET之前为此引入了新的关键字).
(这真的令人不安第一次使用VB ^^)


当你从C#转向VB.NET时,这也令人不安.当使用像:if(myVar ISNOT Nothing和myVar.Count> 0)这样的东西时,这尤其令人讨厌.AND需要是ANDALSO.大多数情况下你不会遇到问题,但是当myVar没有/ null时你可能会感到困惑.我需要使用.NET Reflector来发现我需要使用AndAlso(google for"VB.NET And"没有给出想要的结果).
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有