为什么这两段代码产生不同的输出?
$a = 3;
($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;
Run Code Online (Sandbox Code Playgroud)
没有节目输出但是
$a = 3;
print "But I wanted apple, cherry, or blueberry!\n" and ($a == 4);
Run Code Online (Sandbox Code Playgroud)
给:但我想要苹果,樱桃或蓝莓!
小智 7
因为and是所谓的"短路"操作员.意味着如果有condition1 and condition2,则评估第一个条件,并且仅当第一个条件返回true时才评估第二个条件.
所以,在
$a = 3;
($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;
Run Code Online (Sandbox Code Playgroud)
条件$a==4为false,因此print不评估该语句.
但是,在
$a = 3;
print "But I wanted apple, cherry, or blueberry!\n" and ($a == 4);
Run Code Online (Sandbox Code Playgroud)
该print声明就执行和回报true.评估第二个条件(显然false),但打印已经完成.
AND和OR的真值表是
p q p AND q p OR q
- - ------- ------
F F F F
F T F T
T F F T
T T T T
Run Code Online (Sandbox Code Playgroud)
或者,如果我们分组,
p q p AND q p q p OR q
- - ------- - - ------
F * F F F F
T F F F T T
T T T T * T
Run Code Online (Sandbox Code Playgroud)
换句话说,并不总是需要评估两个操作数以了解最终结果.
Perl(以及其他语言)将其作为一个特征:它将通过尽快返回来"短路"布尔运算符的评估.它不仅是一个很好的优化,它非常有用.它允许这些结构有意义:
func(...)
or die;
condition(...)
and next;
Run Code Online (Sandbox Code Playgroud)
如果没有短路,die并且next将无条件地评估.
如果要评估两个操作数,则需要临时变量
my $f = f(); # f() has side-effects!
my $g = g(); # g() has side-effects!
if ($f && $g) {
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |