ルモーリン

論理演算子の「and」と「&&」の違い

投稿:2018-01-23

やることは同じですけれど優先度が違います。
「優先順位がずっと低いことを除けば && と等価です」perlop - Perl の演算子と優先順位 - perldoc.jp
動作に違いが出るように頑張ったけれど、そもそもこんなコード書かないよ(大笑い)

#!/usr/bin/perl -w

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use Encode::Locale;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

my @param = (0, 123);
alphabet(@param);
symbol(@param);

@param = (10, 123);
alphabet(@param);
symbol(@param);

exit;

sub alphabet {
	my ($a, $b) = @_;

	$b = $a and print "$b\n";
	print "b == $b\n";
}

sub symbol {
	my ($a, $b) = @_;

	$b = $a && print "$b\n";
	print "b == $b\n";
}
WindowsとCentOSで確認しました。
左の項が偽の場合は右の項を評価しないので1行目と2行目は同じに見えます。 けれど真の場合は左の項の範囲が違うのでandと&&で動作が変わります。
b == 0 ←左の項は「$b = $a」
b == 0 ←左の項は「$a」
10   ←左の項「$b = $a」を評価(10が$bに入る)、それから右の項「print」を評価して表示
b == 10
123   ←左の項「$a」を評価して、それから右の項「print」を評価して表示
b == 1 ←「print」の戻り値が代入されている