对'和'关键字感到困惑

Sid*_*tha 2 perl

为什么这两段代码产生不同的输出?

    $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),但打印已经完成.


ike*_*ami 6

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)


Ble*_*der 5

在Perl中,and是一个短路操作员.

PerlMonks很好地解释了短路运算符:

为什么"短路?"

Camel II告诉我们,"短路"一词指的是他们"通过评估可能的最少操作数来确定陈述的真实性".因此,这些运算符基本上会尽早停止对表达式的评估链.这是他们价值的另一个关键.

基本上,如果and语句的左侧为false,则根本不评估右侧.