前置きと後置き
インクリメント演算子とデクリメント演算子には、それぞれ前置きと後置きの二種類が存在します。
インクリメント演算子の前置きと後置きは次のようになります。
前置き: ++変数 後置き: 変数++
デクリメント演算子の前置きと後置きは次のようになります。
前置き: --変数 後置き: 変数--
前のページで使った演算子は後置きのインクリメント演算子です。前置きも後置きもどちらも変数の値を1だけ増加させるという点では同じ動作をします。例えば次の例を見てください
my ($var1, $var2); $var1 = 10; $var2 = 10; $var++; print "$var¥n"; ++$var; print "$var¥n";
上記では変数「$var1」も変数「$var2」もインクリメント演算子を実行した後は同じく1だけ増加します。
前置きと後置きの違い
では前置きと後置きの違いを確認します。次の例を見てください。
my ($var1, $var2); $var1 = 10; $var2 = $var1++;
この場合、変数「$var2」には変数「$var1」に格納されている数値に1が加算された「11」が格納されるように思われますが実際には「10」が格納されます。実は上記の例は次のように記述した場合と同じです。
my ($var1, $var2); $var1 = 10; $var2 = $var1; $var1 = $var1 + 1;
後置きの場合にはインクリメント演算子による演算以外の処理を先に行います。つまり「$var2 = $var1」がまず行われるということです。その為、変数「$var2」には1を増加させる前の「10」が格納されます。そして最後にインクリメント演算子の演算が行われるため変数「$var1」が増加されます。
では次に前置きの例を見てみます。
my ($var1, $var2); $var1 = 10; $var2 = ++$var1;
上記の場合は変数「$var2」には「11」が格納されます。前置きの場合には次のように記述した場合と同じです。
my ($var1, $var2); $var1 = 10; $var1 = $var1 + 1; $var2 = $var1;
前置きの場合にはインクリメント演算子による演算をまず先に行います。つまり「$var1 = $var1 + 1」がまず行われるということです。そしてインクリメント演算子以外の処理が行われます。この時点で変数「$var1」は1増加していますので変数「$var2」には「11」が可能されることになります。
デクリメント演算子の場合も同様で前置きの「--変数」の場合にはまず1だけ減算する処理が行われるのに対して、後置きの「変数--」の場合には他の処理が行われてから減算の処理が行われます。
前置きと後置きでは単独で実行した場合には同じ結果となりますが、インクリメント演算子やデクリメント演算子と他の処理を組み合わせて使う場合には前置きと後置きで結果が異なることがありますので注意して下さい。
サンプルプログラム
では簡単なプログラムで確認して見ます。
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my ($var1, $var2); $var1 = 9; $var2 = $var1++; print "$var1¥n"; print "$var2¥n"; $var1 = 9; $var2 = ++$var1; print "$var1¥n"; print "$var2¥n";
上記を「test4-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
前置きと後置きで処理内容が異なることが確認できます。
( Written by Tatsuo Ikura )