演算子の優先順位
演算子には優先順位が決まっており、優先順位が高いものほど先に演算が実行されます。複数の演算子を組み合わせた式を利用する場合には、どの演算子か先に実行されるのかによって結果が変わることがあり、演算子の優先順位を覚えておくことは重要となります。ここでは Perl における演算子の優先順位について解説します。
(Last modified: )
演算子の優先順位
演算子が一つだけの場合は優先順位を気にする必要はありませんが複数の演算子を組み合わせる場合には演算子の優先順位を把握しておく必要があります。
主な演算子の優先順位は次のようになっています。
演算子 リスト演算子 | 結合順位 |
---|---|
括弧 | 左 |
-> | 左 |
++ -- | しない |
** | 右 |
\ ! ~ + -(+と-は単項演算子) | 右 |
=~ !~ | 左 |
* / % 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 に格納されます。
カッコを使って優先順位を変更する
演算子は優先順位に従って処理が行われますが、括弧は最上位の優先順位ですので括弧を使うことで演算を行う順位を変更することができます。
次の例を見てください。 *
演算子は +
演算子よりも優先順位が高いので先に 5 * 3
の演算が行われます。
my $var; $var = 10 + 5 * 3;
もし 10 + 5
の演算を先に行いたい場合にはカッコを使って次のように記述します。
my $var; $var = (10 + 5) * 3;
上記ではカッコで囲まれた演算が一番優先順位が高くなりますのでまず 10 + 5
が行われます。そのあとで 演算結果の 15 に対して 15 * 3
が行われます。
このように括弧を使用することで、本来の優先順位とは異なる順位で演算を行うことができます。
それでは簡単なサンプルを作成します。
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $var; $var = 10 + 5 * 3; print "10 + 5 * 3 = $var\n"; $var = (10 + 5) * 3; print "(10 + 5) * 3 = $var\n";
テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。
perl sample.pl
次のように実行結果が表示されます。
演算子の優先順位に従って演算した場合と、括弧を使って演算子の優先順位を変更した場合の結果の違いについて確認しました。
-- --
Perl における演算子の優先順位について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。