演算子 (コンピュータ言語)
コンピュータ言語における演算子(えんざんし、英: operator)とは、各種の演算を表わす記号・シンボルである。通例、演算子は単なる記号あるいは記号列であって構文論的な要素であり、それに対応する演算は意味論の側にある。たとえばJavaにおいて、演算子 +
を使った a + b
という式は、構文論上は単にそういう式だというだけである。意味論的には数値の加算であったり、文字列の連結であったりするが、それは a と b の型に依って決まる(理論的には項書き換えのように、構文論的といったものもある)。
演算が作用する対象のことを被演算子(operand; オペランド、被演算数、引数)という。たとえば、n と 3 との和を表す式 "n + 3" において、"+" は演算子であり、その被演算子は "n" と "3" である。また、数式として一般的な被演算子と被演算子の間に演算子を記述する構文は中置記法と呼ばれる。
分類
編集コンピュータプログラミングにおいては、主に記号を用いて演算を指示するものが演算子と呼ばれる。概ね数式などの記述を模倣しているが、一部の演算子に(文字コードおよび文字セットの関係上)通常と異なる記号あるいは文字列が用いられたり、副作用を持っていることがあるなど、数学の演算子とは異なる点もある。
算術演算子
編集算術演算子として、四則演算のうち加算の演算子には、一般的な算術と同じプラス記号 "+
" を用いる。減算の演算子には "−" の代わりにハイフンマイナス "-
" が用いられることが多い。乗算の演算子には "×" の代わりにアスタリスク "*
" を用い、除算の演算子には "÷" の代わりにスラッシュ "/
" が用いられる。整数同士の除算の結果は通例切り捨てにより整数に丸められる言語が多いが、Pascalでは整数の商を求める専用の演算子として英字列 "div
" を用いる。一般的な算術にはない演算子として、除算の余りを求める剰余演算のための演算子が定義されていることがある。C言語およびC++の剰余演算子は "%
" であり、整数型にしか適用できないが、JavaおよびC#では浮動小数点数型にも適用できる。Pascalでは剰余演算子として英字列 "mod
" を用いる。また、BASICにおける "^
" やPythonにおける "**
" のように累乗の演算子を持つ言語もある。
関係演算子
編集関係演算子は、およそ数学とあまり変わらないが、プログラミング言語によって細かい差異が比較的多い傾向にある。以下はその例である。
- = の意味
- Pascalの系統では、代入に
:=
を用い、比較等号(等価演算子)には=
を用いる。 - C言語の系統では、代入に
=
を用い、比較等号(等価演算子)には==
を用いる。代入式は値を持ち、=
だけでは文脈によって違いを判断できない。 - BASICの系統では、代入にも比較等号(等価演算子)にも
=
を用いる。代入は式ではなく文であり、=
が代入と比較のどちらを意味するかは文脈によって決まる。 - また、PHPやJavaScriptのように、
==
と===
という、異なる比較基準の演算子を持つ言語もある。 - 不等号
1 < x < 5
が「xは1より大きく5より小さい」を意味しないプログラミング言語が多い。そのような場合には論理演算子を使って「1 < x and x < 5
」のように記述する。- ≤, ≥
<=
,>=
を用いることが多いが,言語によってはさらに=<
,=>
を認めるものもある。- ≠
- 言語によって、
<>
や!=
などが使用される。
論理演算子
編集論理演算子として、論理積の "and"、論理和の "or"、否定の "not" などがある。排他的論理和の "xor" もある。他に、数値に対して二進法での各桁に論理演算を適用するビット演算(bitwise operation)のためのビット演算子(bitwise operator)がある。一部の言語では、ビット演算の演算子が論理演算子の意味にも多重定義(オーバーロード)されている(C言語ではブーリアン型が無く、基本整数型のint
で代用されているので、論理演算子とビット演算子を混用するとバグになることがある)。他に三項演算子の、条件演算子や、条件演算子のnull比較時の糖衣構文としてNull合体演算子をもつ言語もある。
その他の演算子
編集代入やインクリメントといった、動作に応じて変化していくプログラミング言語の変数としての機能に対応した演算子も存在する。
このほかにも、プログラミング言語によっては文字列、正規表現、参照、配列、動的メモリ確保、名前空間など、数学的な範囲を超えた多様な分野について、それを操作するための演算子が存在する。
C++やC#などのように、プログラミング言語の中には既存の演算子に利用者(プログラマー)が自分で新たな意味を定義することができるものがある(演算子多重定義)。またSmalltalk、Haskell、OCaml、F#、ALGOLおよびFortran(Fortran 90 以降)など、利用者が自分で新たな演算子を定義することができる言語もある(利用者定義演算子)。これらはうまく使いこなせばコードの記述性や直感性を向上させるのに有用だが、乱用すると混乱を招きかねない。Javaのように言語仕様をシンプルに保つため、あえて演算子多重定義をサポートしなかった言語もある。