演算子の優先順位

広告

演算子が一つだけの場合は優先順位を気にする必要はありませんが複数の演算子を組み合わせる場合には演算子の優先順位を把握しておく必要があります。

主な演算子の優先順位は次のようになっています。

演算子 リスト演算子結合順位
括弧
->
++ --しない
**
¥ ! ~ + -(+と-は単項演算子)
=~ !~
* / % x
. + -(+と-は二項演算子)
<< >>
名前付き単項演算子しない
> >= < <=しない
== != <=>しない
&
| ^
&&
||
.. ...しない
?:
= += -= .= (その他二項代入演算子)
, =>
リスト演算子しない
not
and
or xor

他にも演算子はありますが主なものだけを抜粋しました。表の見方としては優先順位は上に行くほど高く下に行くほど低くなります。また同じ行に含まれる演算子は同じ優先順位です。

例えば演算子「*」は演算子「+」よりも優先順位が高くなっています。下記のサンプルを見てください。

my $var;

$var = 10 + 5 * 3;

「*」は「+」よりも優先順位が高いのでまず「5 * 3」が行われます。

my $var;

$var = 10 + 15;

次に「10 + 15」が行われます。その結果である「25」が変数「$var」に格納されます。なお代入演算子である「=」は優先順位が「*」や「+」よりも低くなっていますので、代入は最後に行われます。

同じ優先順位である「*」と「/」が同時に使われていた場合は結合順位に従って処理が行われます。「*」や「/」の結合順位は左ですので左から順に演算が行われます。下記のサンプルを見てください。

my $var;

$var = 10 * 3 / 5;

「*」と「/」は優先順位が同じですので結合順位に従い左から順に処理が行われます。よって「10 * 3」がまず実行されます。

my $var;

$var = 30 / 5;

次に「30 / 5」が行われます。その結果である「6」が変数「$var」に格納されます。

カッコを使って優先順位を変更

演算子は優先順位に従って処理が行われますが、括弧は最上位の優先順位ですので括弧を使うことで演算順位を制御することが出来ます。

my $var;

$var = 10 + 5 * 3;

上記では先に「5 * 3」が行われます。ここで「10 + 5」を先に行いたい場合にはカッコを使って次のように記述します。

my $var;

$var = (10 + 5) * 3;

上記ではカッコで囲まれた演算が一番最優先となりますのでまずは「10 + 5」が行われます。

my $var;

$var = 15 * 3;

そして「15 * 3」が行われます。その結果である「45」が変数「$var」に格納されます。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test10-1.pl

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $var;

$var = 10 * 3 / 5;
print "10 * 3 / 5 = $var¥n";

$var = (10 + 5) * 3;
print "(10 + 5) * 3 = $var¥n";

上記を「test10-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

演算子の優先順位

( Written by Tatsuo Ikura )