Perlの演算子とC言語の演算子は、種類が似ていて、優先順位が同じ
Perlの演算子とC言語の演算子は、種類が似ていて、演算子の優先順位が同じです。
Perlの演算子
Perlの演算子です。C言語の演算子と同じものと、機能が似ているものを取り上げました。加算演算子、減算演算子、減算演算子、減算演算子、剰余演算子、インクリメント/デクリメントなどの算術演算子、数値比較演算子、論理演算子、単項演算子、シフト演算子、アロー演算子、3項演算子を取り上げています。
# 加算演算子 my $ret = $x + $y; # 減算演算子 my $ret = $x - $y; # 減算演算子 my $ret = $x * $y; # 減算演算子 my $ret = $x / $y; # 剰余演算子 my $ret = $x % $y; # インクリメント/デクリメント my $ret = ++$x; my $ret = $x++; my $ret = --$x; my $ret = $x--; # 数値の比較演算子 my $ret = $x > $y; my $ret = $x >= $y; my $ret = $x < $y; my $ret = $x <= $y; my $ret = $x == $y; my $ret = $x != $y; # 論理演算子 my $ret = $x && $y; my $ret = $x || $y; my $ret = !$x; # 単項演算子 my $ret = +$x; my $ret = -$x; # 右シフト演算子 my $ret = $x << $y; # 左シフト演算子 my $ret = $x >> $y; # 代入演算子 my $ret = $x; my $ret += $x; my $ret -= $x; my $ret *= $x; my $ret /= $x; my $ret %= $x; my $ret >>= $x; my $ret <<= $x; # アロー演算子 my $ret = $foo->{x}; # もしアクセッサを定義すれば、上記は以下のように書ける my $ret = $foo->x; # 3項演算子 my $ret = $flag ? $x : $y;
C言語の演算子
C言語の演算子です。加算演算子、減算演算子、減算演算子、減算演算子、剰余演算子、インクリメント/デクリメントなどの算術演算子、数値比較演算子、論理演算子、単項演算子、シフト演算子、アロー演算子、3項演算子を取り上げています。
// 加算演算子 int32_t ret = x + y; // 減算演算子 int32_t ret = x - y; // 乗算演算子 int32_t ret = x * y; // 除算演算子 int32_t ret = x / y; // 剰余演算子 int32_t ret = x % y; // インクリメント/デクリメント int32_t ret = ++x; int32_t ret = x++; int32_t ret = --x; int32_t ret = x--; // 数値の比較演算子 int32_t ret = x > y; int32_t ret = x >= y; int32_t ret = x < y; int32_t ret = x <= y; int32_t ret = x == y; int32_t ret = x != y; // 論理演算子 int32_t ret = x && y; int32_t ret = x || y; int32_t ret = !x; // 単項演算子 int32_t ret = +x; int32_t ret = -x; // 右シフト演算子 int32_t ret = x << y; // 左シフト演算子 int32_t ret = x >> y; // 代入演算子 int32_t ret = x; int32_t ret += x; int32_t ret -= x; int32_t ret *= x; int32_t ret /= x; int32_t ret %= x; int32_t ret >>= x; int32_t ret <<= x; // アロー演算子 int32_t ret = foo->x; // 3項演算子 int32_t ret = flag ? x : y;
Perlの演算子とC言語の演算子の比較
Perlの演算子の数値演算子、数値の比較演算子、単項演算子、論理演算子、シフト演算子、インクリメント/デクリメント、代入演算子、3項演算子は、C言語と機能が同じです。
代入演算子は、式を返すという点でもC言語と同じです。代入文ではなく、代入式として評価されます。
Perlのアロー演算子は、参照を通してフィールドにアクセスできるという点がC言語と似ています。
アクセッサと呼ばれる、フィールドにアクセスするための、メソッドを定義してやると、Perlのフィールドアクセスと、C言語のフィールドアクセスは、値を取得する場合は、見た目が同じになります。
C言語には3項演算子がありますが、Perlにも存在しています。条件に応じて、値を返すことのできる演算子です。
Perlの演算子の優先順位
Perlの演算子の優先順位です。高い方から書き出しています。
左結合 -> 非結合 ++ -- 右結合 ! 単項の+ 単項の- 左結合 * / % x 左結合 + - 左結合 << >> 非結合 < > <= >= 非結合 == != 左結合 && 左結合 || 右結合 = += -= *= などの代入演算子
C言語の演算子の優先順位
C言語の演算子の優先順位です。高い方から書き出しています。
左結合 ++ -- -> 右結合 ! 単項+ 単項- ++ -- 左結合 * / % 左結合 + - 左結合 << >> 左結合< <= > >= 左結合 == != 左結合 && 左結合 || 右結合 = += -= *= /= %= <<= >>= などの代入演算子
Perlの演算子の優先順位とC言語の演算子の優先順位の比較
Perlの演算子の優先順位とC言語の演算子の優先順位の比較してみましょう。Perlでは、アロー演算子がインクリメント/デクリメント演算子より優先順位が高いことを除いて、C言語と同一です。
Perlでは、C言語で覚えた、演算子の優先順位をほぼそのまま使うことができます。
C言語の演算子や演算子の優先順位に対して、バグが生まれやすいなど、事実に基づかない、過剰な批判をする人もいます。
一方で、Perlは、C言語の演算子の優先順を、そのまま受け入れています。
これは、C言語を学んだことのあるユーザーが、混乱せずに、その知識をそのまま使えるように、Perlでは、配慮されているということです。
C言語は入門教材で、必ず出てくるといってもよいプログラミング言語です。Perlは、C言語に見慣れたユーザーが、混乱しないで、すぐに使い始められるようになっています。
PerlとC言語の他の類似点
この記事では、Perlの演算子の種類と演算子の優先順位がC言語と似ているということを書きましたが、Perlのif文、for文、while文、インクリメント/デクリメント、演算子の優先順位、スコープ、参照概念も、C言語の文法と似ています。