インクリメント演算子の+と-は実装が大きく異なっているのでしょうか?

投稿者: Anonymous

まったく実践的じゃない質問です。

単なる好奇心からインクリメント演算子を何気なくいじって、結果がどうなるか試していました。

すると正負をひっくり返した場合にエラーが出る場合と出ない場合がありました。

+--+を前置した場合:

$ perl -E '$z = 3; say +--+$z;'
2

-++-を前置した場合:

$ perl -E '$z = 3; say -++-$z;'
Can't modify negation (-) in preincrement (++) at -e line 1, near "$z;"
Execution of -e aborted due to compilation errors.

どうしてこのような差が出るんでしょうか?

perlのバージョンは5.18.2、OSXの上で実行しています。


以下はMO=Deparseした時の出力です:

$ perl -MO=Deparse -E '$z = 3; say +--+$z;'
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
$z = 3;
say --$z;
-e syntax OK

$ perl -MO=Deparse -E '$z = 3; say -++-$z;'
Can't modify negation (-) in preincrement (++) at -e line 1, near "$z;"
-e had compilation errors.
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
$z = 3;
say -++(-$z);

解決

MO=Deparseの出力を見ての推測での回答になりますが、
インクリメント演算子の違いではなく単体の+-が先頭についた時の処理の違いではないでしょうか?

通常、インクリメント演算子の前に他の演算子を置くことはできませんが、
先頭に+がついた場合は第一にそれが無視され残りの演算を行うためインクリメントが正常に行われるのだと思われます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *