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中)为此目的引入了AndAlso和OrElse运算符.
此外,从评论来看,似乎csh从右到左执行短路评估,使问题更加令人困惑.
还应该指出的是,短路评估(或缺乏)有可能需要注意的危险.例如,如果第二个操作数是一个具有任何副作用的函数,则代码可能无法完全按照程序员的意图执行.
Ale*_*ren 20
对于VB6来说并非如此.
在VB.net中,如果您希望它跳过评估第二个表达式,则必须使用"AndAlso"而不是"And".
Mar*_*ell 14
是否适用于所有语言,如JAVA,C#等?
在C#中,这仅适用于短路运营商' ||
'和' &&
'; 如果您只是使用' |
'或' &
',它将每次评估双方.
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)
在某些方面它有点好,因为你可以推断程序员知道需要短路的表达式,并且条件不是偶然的.
对于C语言的"孩子"语言来说确实如此:PHP,Java,C++,C#,......或者像Perl一样的"灵感".
但对于VB来说却不是这样(至少在.NET之前为此引入了新的关键字).
(这真的令人不安第一次使用VB ^^)
归档时间: |
|
查看次数: |
9890 次 |
最近记录: |