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

Kim*_*cks 38 language-agnostic if-statement short-circuiting

在PHP代码中

if(a() && b())
Run Code Online (Sandbox Code Playgroud)

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

同样地,在

if (a() || b())
Run Code Online (Sandbox Code Playgroud)

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

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

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

<?php
function a(){
echo 'a';
return false;
}

function b(){
echo 'b';
return true;
}


if(a() && b()){
echo 'c';
}
?>
Run Code Online (Sandbox Code Playgroud)

Pat*_*ald 66

这称为短路评估.

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

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

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

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

  • VB:"亲爱的,这样做也是这样的,也是这个*OrElse*!" (10认同)
  • 不要忘记VB.NET OrElse运算符! (2认同)

Ale*_*ren 20

对于VB6来说并非如此.

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

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

Mar*_*ell 14

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

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

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

wax*_*ing 12

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


小智 8

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


Mar*_*son 7

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

and then
or else
Run Code Online (Sandbox Code Playgroud)

像这样使用:

if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y
Run Code Online (Sandbox Code Playgroud)

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


Pas*_*TIN 5

对于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"没有给出想要的结果). (2认同)