3.5. 演算子

演算子は, 一つあるいは二つの引数を取る特別な関数(あるいはメソッド)のようなものであり, 一つの引数を取るものを単項演算子, 二つの引数を取るものを二項演算子とよぶ.

演算子には,引数のオブジェクトのクラス(型)により動作が異なってくるものと, そうでないものがある.

3.5.1. 対象オブジェクトによって動作が変わる演算子

対象オブジェクトによって動作が変わる演算子には以下のものがある.

単項演算子

-, !, ~

二項演算子(算術演算子)

+ (加算), - (減算), * (乗算), / (除算), % (法・モジュロ), ** (冪乗)

二項演算子(関係演算子)

==, !=, >=, <=, >, <

二項演算子(論理演算子)

&, &&, |, ||

以上の演算子の動作については, 関連するクラス (標準ライブラリー) のドキュメントを参照.

3.5.2. 演算子の呼び出し規則

対象オブジェクトによって動作が変わる演算子はメソッド的で, クラスごとにその動作が定義されている. 例えばintegerrealオブジェクトの加算演算子は数値の加算として定義されているが, stringオブジェクトの場合は文字列の連結として定義されている. 単項演算子の場合は唯一の引数オブジェクトのクラスで定義されている演算子が呼び出される.

二項演算子の場合は二つの引数オブジェクトのクラスの組に対して, どの演算子が呼び出されるかが決まっている.例えば,

1+1.0

の場合,(integer, real)の 組に対する加算演算子はrealクラスの加算演算子が呼び出されるように 標準ライブラリーによって定義されている(暗黙の型変換が起こるわけではない). 一方で,integerstringの 加算演算子は定義されていないので,

1+"abc"

等は実行時例外が発生する.

3.5.3. 動作がインタープリターで規定されている演算子

動作がインタープリターで規定されている以下の演算子には以下のものがある.

単項演算子

++ (後置インクリメント), -- (後置デクリメント), ++ (前置インクリメント), -- (前置デクリメント), ?

二項演算子

, (カンマ演算子), instanceof, = (代入演算子), +=, -=, *=, /=, &=, |=

3.5.4. インクリメント・デクリメント演算子

	++,-- (前置),
	++,-- (後置)
      

インクリメント(++), デクリメント(--)演算子は, 対象となるオブジェクトを+1あるいは-1する. さらにC等の他の言語の仕様と同様に, 前置演算子では加減算が行われた後の値が返され, 後置演算子では加減算が行われる前の値が返される.

前置演算子は以下のように評価される.

++の場合
[] = [] + 1
--の場合
[] = [] - 1

[]は左辺式(左辺式参照) として妥当なものでなければならない.また,対象となるオブジェクトは, integer以外でも, 整数1との加算・減算演算子が定義されているオブジェクトでなら有効である.

一方,後置演算子は以下のように評価される.

++の場合
		[], [] = [] + 1
	      
--の場合
		[], [] = [] - 1
	      

前置と同様に[式]は左辺式(左辺式(左辺式参照)) として妥当なものでなければならず, 対象となるオブジェクトについては整数1との加算・減算演算子が定義されていなければならない.

[Note] Note

演算前の値を結果として返す必要性から, 実行される操作が複雑になっており(カンマ演算子の項参照), そのため,単に値の加減算が行いたいだけで評価された結果を使用しない場合は, 前置演算子を用いたほうが高速である.

[Note] Note

1.0.0.54の実装では,[]として有効なものは 変数の参照のみである.(左辺式なら何でもOKにするべき)

3.5.5. ?演算子

?

?演算子は,デバッグ用の演算子であり, 対象のが評価された結果得られるオブジェクトの 値・型等の情報を端末に表示する.

3.5.6. カンマ演算子

	,
      

左辺の, 右辺の両者を順に評価し, 一つめ(左辺)の結果を値として返す.

3.5.7. 代入演算子

	左辺式=右辺式
      

右辺式を評価した結果を 左辺式に代入する. 代入に際しては, 右辺式を評価した結果得られるオブジェクトへの参照が 左辺式にコピーされる. そのため,listdict等の コンテナクラス(他のオブジェクトへの参照を含むクラス)の 場合は,深いコピー [11] ではなく,浅いコピーが行われる点に注意.

右辺式は任意の式であるが,左辺式は以下のいづれかでなければならない.

変数への参照

$aなど

配列・辞書要素への参照

$a[$i], $b{"foo"}など

これ以外の場合はコンパイル時に文法エラーとなる [12]

代入演算子には,+=演算子など 演算を同時に行うバリエーションがある(複合代入演算子). 例えば+=演算子の場合,

	  式1 += 式2
	

	  式1 = 式1 + 式2
	

のように評価される.他の複合代入演算子も同様である.

3.5.8. instanceof演算子

	instanceof識別子
      

右のを評価した結果のオブジェクトが, 左の識別子(クラス名)のインスタンスであれば trueを,そうでない場合はfalseを返す.

$a instanceof string
if ($b instanceof list) { ...

3.5.9. 演算子の優先順位

演算子の優先順位は以下のようになっている(低から高の順).

  1. , (カンマ演算子)

  2. = (代入演算子), 複合代入演算子 += 等 (右結合)

  3. ?

  4. ||

  5. &&

  6. |

  7. &

  8. ==, !=

  9. <, >, <=, >=

  10. instanceof

  11. +, -

  12. *, /, %

  13. **

  14. +, - (単項,ただし+は何もしない演算子)

  15. !, ~

  16. ++, --

[Note] Note

代入関連以外の二項演算子はすべて左結合,単項演算子は右結合である. さらに,1.0.0.54の実装では,冪乗演算子が左結合になっているが, これは将来のバージョンで右結合に変更される予定.



[11] 新しいコンテナオブジェクトが作成されて要素がすべてコピーされること.

[12] 左辺式として有効なものを返す演算子や関数・メソッドは作れない.