2

これらの2つのコードが異なる出力を生成するのはなぜですか?

    $a = 3;
    ($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;

プログラム出力はありませんが

    $a = 3;
    print "But I wanted apple, cherry, or blueberry!\n" and ($a == 4);

与える:しかし、私はリンゴ、チェリー、またはブルーベリーが欲しかった!

4

4 に答える 4

7

andいわゆる「短絡」演算子だからです。つまり、がある場合condition1 and condition2、最初の条件が評価され、最初の条件がtrueを返した場合にのみ、2番目の条件が評価されます。

だから、

$a = 3;
($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;

条件$a==4がfalseであるため、printステートメントは評価されません。

ただし、

$a = 3;
print "But I wanted apple, cherry, or blueberry!\n" and ($a == 4);

printステートメントはその処理を実行し、を返しますtrue。2番目の条件が評価されます(これは明らかにですfalse)が、印刷はすでに完了しています。

于 2012-08-10T03:49:27.120 に答える
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

または、グループ化する場合、

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

つまり、最終結果を知るために両方のオペランドを評価する必要は必ずしもありません。

Perl(他の言語の中でも)はそれを機能として組み込んでいます:それはできるだけ早く戻ることによってブール演算子の評価を「短絡」させます。それは良い最適化であるだけでなく、非常に便利です。これにより、これらの構成を意味のあるものにすることができます。

 func(...)
    or die;

 condition(...)
    and next;

短絡なしで、die無条件nextに評価されます。

両方のオペランドを評価する場合は、一時変数が必要になります

 my $f = f();  # f() has side-effects!
 my $g = g();  # g() has side-effects!
 if ($f && $g) {
    ...
 }
于 2012-08-10T04:08:09.817 に答える
5

Perlでは、andは短絡演算子です。

PerlMonksは、短絡演算子をうまく説明しています。

なぜ「短絡」なのか?

Camel IIによると、「短絡」という用語は、「可能な限り少ない数のオペランドを評価することによって、ステートメントの真実を判断する」という事実を指します。したがって、本質的にこれらの演算子は、式の評価のチェーンをできるだけ早く停止します。それが彼らの価値のもう一つの鍵です。

基本的に、ステートメントの左側andがfalseの場合、右側はまったく評価されません。

于 2012-08-10T03:51:06.607 に答える
-1

優先順位(どの演算子が最初に実行され、どの演算子が最後に実行されるか)がわからない場合は、いつでもPerlでコードを解析してから、括弧を最大限に使用して再度解析を解除できます。

perl -MO=Deparse,-p -e '($a == 4) and print "But I wanted apple, cherry, or blueberry!\n" ;'

どの出力:

(($a == 4) and print("But I wanted apple, cherry, or blueberry!\n"));
于 2012-08-10T07:30:51.360 に答える