コンピュータプログラミングにおいて、演算子とは、ユーザー定義関数として定義できない機能(C言語のsizeofなど)を提供する、あるいは関数とは異なる構文を持つ(例えば、中置加算など)プログラミング言語の構成要素です。他のプログラミング言語の概念と同様に、演算子の意味は、実務者の間では議論の余地はあるものの、一般的に受け入れられています。a+b
一部の演算子は、通常の関数構文よりも見慣れた表示を可能にするために、関数識別子には通常使用されない記号で表されます。たとえば、大なりをテストする関数は と名付けられますが、 多くの言語gtでは、コードをより見慣れたものにするために、中置記号演算子が用意されています。たとえば、次のようになります。
if gt(x, y) then return
次のいずれかになります。
if x > y then return
言語によっては、言語で定義された演算子をユーザー定義の動作で上書きできるものや、ユーザー定義の演算子記号を使用できるものがある。
演算子は関数とは意味的に異なる場合もあります。例えば、短絡評価を行うブール演算では、前の引数が偽でない場合にのみ、後の引数が評価されます。
多くの演算子は、構文的にユーザー定義関数とは異なります。ほとんどの言語では、関数は固定の優先順位と結合規則を持つ前置記法であり、多くの場合、括弧が必須です(Lispのやなど)。一方、多くの演算子は中置記法であり、括弧などの区切り文字の使い方が異なります。Func(a)(Func a)
一般に、演算子は、前置、中置、後置、一致、周置、または二項演算子のいずれかであり、[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]演算子を含む式の構文は、そのアリティ(オペランドの数)、優先順位、および(該当する場合)結合性によって決まります。ほとんどのプログラミング言語は、二項演算子といくつかの単項演算子をサポートしており、C の?:演算子のように、より多くのオペランドをサポートする言語もあります。これは三項演算子です。単項マイナスなどの前置単項演算子と、後置インクリメント-xなどの後置単項演算子があり、二項演算は、またはなどの中置です。アリティの高い中置演算には、 C の三項演算子?: のように追加の記号が必要で、と書きます。実際、これが唯一の一般的な例であるため、三項演算子と呼ばれることがよくあります。前置操作と後置操作は、任意の引数数をサポートできます。x++x + yx = y a ? b : c1 2 3 4 +
演算子の意味は、通常の関数の意味とは大きく異なる場合があります。参考までに、加算は通常の関数と同様に評価されます。たとえば、引数が評価されてから関数の動作が適用されるというx + y点で、は関数と同等です。ただし、代入は異なります。たとえば、の場合、ターゲットは評価されません。代わりに、その値はの値に置き換えられます。スコープ解決演算子と要素アクセス演算子(C++の場合、それぞれと)は、値ではなく識別子名に対して動作します。add(x, y)a = babFoo::Bara.b
例えばC言語では、配列のインデックス演算子は読み取りアクセスと代入の両方に使用できます。次の例では、 インクリメント演算子が配列の要素値を読み取り、その値を代入しています。
++ a [ i ];C++の演算子は、単一の引数に影響を与える一連の演算子をサポートすることで、流暢な構文を実現します。例:<<
cout << "Hello" << " " << "world!" << endl ;一部の言語では、アドホックな多態性を持つ演算子(本質的にオーバーロードされている演算子)が提供されています。たとえば、Javaでは、演算子は数値+を合計したり、文字列を連結したりします。
一部のプログラミング言語( C++やFortranなど)は、ユーザー定義の オーバーロードをサポートしています。言語によって定義された演算子をオーバーロードすることで、入力の型に応じて異なる動作をさせることができます。
一部の言語(C、C++、PHPなど)は固定の演算子セットを定義していますが、他の言語(Prolog、[ 6 ] F#、OCaml、Haskellなど)はユーザー定義の演算子を許可しています。一部のプログラミング言語では、演算子シンボルを+や:=などの特殊文字に制限していますが、他の言語では(Pascalなど)のような名前、さらには任意の名前(Fortranなど、最大31文字の演算子名がドットで囲まれる[ 7 ] )を許可しています。div
ほとんどの言語は、ユーザー定義演算子をサポートしていません。なぜなら、この機能は構文解析を著しく複雑にするからです。新しい演算子を導入すると、言語のアリティと優先順位の字句仕様が変更され、句レベルの字句解析に影響します。特に実行時定義によるカスタム演算子は、言語の構文がチューリング完全である可能性があるため、プログラムの正しい静的解析を不可能にすることがよくあります。構文木を構築するだけでも停止問題を解く必要がある場合があり、これは不可能です。これは、たとえばPerlやLispの一部の方言で発生します。
ある言語が新しい演算子を定義することを許容する場合、その仕組みにはメタプログラミング、つまり別の言語で演算子を指定することが含まれる可能性がある。
一部の言語では、オペランドを暗黙的に変換(強制)して互換性を持たせます。たとえば、Perl の強制ルールでは12 + "3.14"、 は に評価されます15.14。文字列リテラル"3.14"は、加算が適用される前に数値 3.14 に変換されます。さらに、は浮動小数点として扱われるため、 は整数リテラルである3.14にもかかわらず、結果は浮動小数点になります。JavaScriptは異なるルールに従うため、は文字列に変換され、それが 2 番目のオペランドと連結されるため、同じ式は に評価されます。12"123.14"12
一般的に、プログラマーは予期せぬ誤った動作を避けるために、オペランドの型変換に関する特定の規則を理解しておく必要がある。
+=(拡張代入とも呼ばれる): , -=, *=, /=, %=, <<=, >>=, &=, ^=,|=以下の表は、いくつかのプログラミング言語における演算子の機能を示しています。