オペレーター(コンピュータプログラミング)

コンピュータプログラミングにおいて演算子とは、ユーザー定義関数C言語のsizeofなど)として定義できない機能や、関数とは異なる構文(C言語の挿入辞加算など)を持つ機能を提供するプログラミング言語構成要素です。他のプログラミング言語の概念と同様に、演算子の意味は一般的に受け入れられていますが、専門家の間では議論の余地があります。同時に、各言語はそれぞれの文脈において特定の意味を与えているため、意味は言語によって異なります。 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後置単 x++項演算子にはポストインクリメント があります。二項演算は中置で、またはx + yですx = y。アリティの高い中置演算では追加の記号が必要になります。たとえば、C の三項演算子 ?: は – と記述されます。実際、これが唯一の一般的な例であるため、三項演算a ? b : cと呼ばれることがよくあります。前置演算と後置演算は、 のように、任意のアリティをサポートできます1 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#OCamlHaskell)ではユーザー定義の演算子が利用可能です。プログラミング言語によっては、演算子記号を+:=などの特殊文字に制限しているものもあれば、 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

一般に、プログラマーは予期しない誤った動作を避けるために、オペランドの強制に関する特定のルールを認識しておく必要があります。

数学演算子
プログラム構造演算子
条件演算子
注目すべきCおよびC++演算子

複合演算子
  • C /C++ における複合代入(拡張代入呼ばます: +=、、、、、、、、、、、-=*=/=%=<<=>>=&=^=|=
  • 融合:例えばcis x = cos x + i sin x

プログラミング言語における演算子機能

次の表は、いくつかのプログラミング言語における演算子の機能を示しています。

言語記号演算子英数字演算子
接頭辞
挿入句
ポストフィックス
優先順位
結合性
過負荷
ユーザー定義の
オーバーロード
ユーザー定義
シンボル
ALGOL 68 それぞれの記号演算子には英数字の同等の演算子があり、一部は非ASCIIの同等の演算子がある+* ** * / % %* %× - + &lt; &lt;= >= > = /= & -:= +:= *:= /:= %:= %*:= +=: :=: :/=:

非ASCII:¬ +× ⊥ ↑ ↓ ⌊ ⌈ × ÷ ÷× ÷* □ ≤ ≥ ≠ ∧ ∨ ×:= ÷:= ÷×:= ÷*:= %×:= :≠:

not abs arg bin entier leng level odd repr round shorten i shl shr up down lwb upb lt le ge gt eq ne and or over mod elem minusab plusab timesab divab overab modab plusto is isntはいはいいいえはい(プレフィックス演算子の優先度は常に 10 です)中置演算子は左結合、前置演算子は右結合ですはいはいはい
APL+ - × ÷ ⌈ ⌊ * ⍟ | ! ○ ~ ∨ ∧ ⍱ ⍲ &lt; ≤ = ≥ > ≠ . @ ≡ ≢ ⍴ , ⍪ ⍳ ↑ ↓ ? ⍒ ⍋ ⍉ ⌽ ⊖ ∊ ⊥ ⊤ ⍎ ⍕ ⌹ ⊂ ⊃ ∪ ∩ ⍷ ⌷ ∘ → ← / ⌿ \ ⍀ ¨ ⍣ & ⍨ ⌶ ⊆ ⊣ ⊢ ⍠ ⍤ ⌸ ⌺ ⍸(⎕ プレフィックスが必要です)はい(一次関数のみ)はいはい(高階関数のみ)高階関数は一階関数に先行する高階関数は左結合、一階関数は右結合であるはいはいはい(英数字のみ)
B() [] ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | [[?:]] = =+ =- =* =/ =% =& =^ =|[8]はいはいはいはいはいいいえいいえいいえ
C() [] -> . ! ~ ++ -- + - * & / % << >> < <= > >= == != ^ | && || [[?:]] = += -= *= /= %= &= ^=sizeofはいはいはいはいはいはいいいえいいえ
C++(Cと同じ)(Cプラスと同じ)typeid new delete throw decltype static_cast dynamic cast reinterpret_cast const_castはいはいはいはいはいはいはいいいえ
C#(Cプラスと同じ)?. ?[] ?? ??=sizeof nameof new stackalloc await throw checked unchecked is as delegate default true false
LINQ : from select where group...by group...by...into join...in...on...equals join...in...on...equals...into orderby orderby...descending
Roslynのみ: __makeref __refvalue __reftype
はいはいはいはいはいはいはいいいえ
ジャワ(Cと同じ)new throw instanceofはいはいはいはいはいはいいいえいいえ
エッフェル[] + - * / // = /= not and or implies "and then" "or else" はいはいいいえはいはいいいえはいはい
ハスケル+ - * / ^ ^^ ** == /= > < >= <= && || >>= >> $ $! . ++ !! : (その他多数)(関数名はバッククォートで囲む必要があります)はいはいいいえはいはいはい、Typeクラスを使用しますはい
mvBasic データベース/ユニベーシック+ - * / ^ ** : = ! & [] += -= := # < > <= >= <> >< =< #> => #< AND OR NOT EQ NE LT GT LE GE MATCH ADDS() ANDS() CATS() DIVS() EQS() GES() GTS() IFS()はいはいはいはいはいはいはいいいえ
パスカル* / + - = < > <> <= >= :=not div mod and or inはいはいいいえはいはいはいいいえいいえ
パール-> ++ -- ** ! ~ \ + - . =~ !~ * / % < > <= >= == != <=> ~~ & | ^ && || ' '' // .. ... ?: = += -= *= , => print sort chmod chdir rand and or not xor lt gt le ge eq ne cmp x はいはいはいはいはいはいはいいいえ
PHP[] ** ++ -- ~ @![9] * / % + - . << >> < <= > >= == != === !== <> <=> & ^ | && || ?? ?: = += -= *= **= /= .= %= &= |= ^= <<= >>= clone new unset print echo isset instanceof and or xorはいはいはいはいはいいいえいいえいいえ
PL/I( ) -> + - * / ** > ¬> >= = ¬= <= < ¬< ¬ & | ||はいはいいいえはいはいいいえいいえいいえ
プロローグ:- ?- ; , . =.. = \= < =< >= > == \== - + / *spy nospy not is modはいはいはいはいはいいいえいいえはい
++ -- ** ! ~ ~~ * / + - . < > <= >= == != <=> & | ^ && || // [10]print sort chmod chdir rand and or not xor lt gt le ge eq ne leg cmp x xxはいはいはいはいはいはいはいはい[11]
雑談(最大2文字[12](英数字記号にはコロンが必要です)いいえはいはいいいえいいえはいはいはい
迅速(任意のUnicode記号文字列を除く).(含む)! ~ + - * / % =+ =- =* =/ =% &+ &- &* =&+ =&- =&* && || << >> & | ^ == != < <= > >= ?? ... ..< is as as?はいはいはいはい(優先グループ内の半順序として定義)はい(優先グループの一部として定義)はいはいはい
ビジュアルベーシック.NET() . ! ?() ?. ?! + - * / \ & << >> < <= > >= ^ <> = += -= *= /= \= &= ^= <<= >>=New Await Mod Like Is IsNot Not And AndAlso Or OrElse Xor If(...,...) If(...,...,...) GetXmlNamespace(...) GetType(...) NameOf(...) TypeOf...Is TypeOf...IsNot DirectCast(...,...) TryCast(...,...)
リンク: From Aggregate...Into Select Distinct Where <Order By>...[Ascending|Descending] Take <Take While> Skip <Skip While> Let Group...By...Into Join...On <Group Join...On...Into>
はいはいはいはいはいはいはいいいえ

参照

参考文献

  1. ^ 「演算子入力フォーム—Wolfram言語ドキュメント」reference.wolfram.com
  2. ^ 「Maxima 5.42.0 マニュアル: 7. 演算子」. maxima.sourceforge.net .
  3. ^ 「接頭辞、接尾辞、および接尾辞演算子」。mythryl.org
  4. ^ 「演算子」. doc.perl6.org .
  5. ^ Pribavkina, Elena V.; Rodaro, Emanuele (2010). 「正規言語における接頭辞、接尾辞、二項演算子、中置演算子の状態複雑度」.言語理論の発展. コンピュータサイエンス講義ノート. 第6224巻. pp.  376– 386. doi :10.1007/978-3-642-14455-4_34. ISBN 978-3-642-14454-7
  6. ^ "SWI-プロローグ -- op/3". www.swi-prolog.org
  7. ^ 「Defined Operations」. Intel . 2025年5月6日閲覧
  8. ^ 「A TUTORIAL INTRODUCTION TO THE LANGUAGE B」。2017年4月3日時点のオリジナルよりアーカイブ2024年8月3日閲覧。
  9. ^ 「PHP: エラー制御演算子 - マニュアル」。php.net
  10. ^ 「演算子」. docs.perl6.org .
  11. ^ 「関数」. docs.perl6.org .
  12. ^ Goldberg, Adele; Robson, David (1983). Smalltalk-80: 言語とその実装(PDF) . Reading, Mass.: Addison-Wesley. ISBN 0-201-11371-6
Retrieved from "https://en.wikipedia.org/w/index.php?title=Operator_(computer_programming)&oldid=1323876895"