在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从右到左执行短路评估,使问题更加令人困惑.
还应该指出的是,短路评估(或缺乏)有可能需要注意的危险.例如,如果第二个操作数是一个具有任何副作用的函数,则代码可能无法完全按照程序员的意图执行.
这称为短路评估.
对于从C(C,C++,Java,C#)派生的语言通常都是如此,但对于所有语言都不是这样.
例如,VB6不会这样做,也不是在早期版本的VB.NET中完成的.VB8(在Visual Studio 2005中)为此目的引入了AndAlso和OrElse运算符.
此外,从评论来看,似乎csh从右到左执行短路评估,使问题更加令人困惑.
还应该指出的是,短路评估(或缺乏)有可能需要注意的危险.例如,如果第二个操作数是一个具有任何副作用的函数,则代码可能无法完全按照程序员的意图执行.
对于VB6来说并非如此.
在VB.net中,如果您希望它跳过评估第二个表达式,则必须使用"AndAlso"而不是"And".
是否适用于所有语言,如JAVA,C#等?
在C#中,这仅适用于短路运营商' ||
'和' &&
'; 如果您只是使用' |
'或' &
',它将每次评估双方.
它被称为短路评估,大多数语言都是这样做的.在某些语言中,存在不执行此操作的运算符.
Pascal的原始版本没有,这引起了很多悲伤.现代帕斯卡,如德尔福的工作方式与C等人相同.
Ada有特殊的短路形式的条件:
and then or else
像这样使用:
if p.next /= null and then p.next.name = 'foo' if x = 0 or else 1/x = y
在某些方面它有点好,因为你可以推断程序员知道需要短路的表达式,并且条件不是偶然的.
对于C语言的"孩子"语言来说确实如此:PHP,Java,C++,C#,......或者像Perl一样的"灵感".
但对于VB来说却不是这样(至少在.NET之前为此引入了新的关键字).
(这真的令人不安第一次使用VB ^^)