演算子の優先順位
演算子の優先順位とは、数学およびコンピュータプログラミングにおいて、数式のどの部分から先に計算すべきかを明確化する規則である。
例えば、数学や多くのコンピュータ言語では乗法は加法より先に行われる。2 + 3 × 4 という式の計算結果は14になる。( と )、{ と }、[ と ] といった括弧には計算順序の混乱を防ぐ独自の規則が適用され、例えば先の式は 2 + (3 × 4) とも書けるが、括弧がなくとも乗法が優先されるという規則だけで式の値は一意に定まる。
代数学的記法が導入された際、乗法が加法より優先されるようになった[1]。したがって、3 + 4 × 5 = 4 × 5 + 3 = 23 となる。冪乗が16世紀から17世紀に導入されたとき、加法と乗法より優先されるとされ、底の右肩に冪指数を記述するようになった。したがって 3 + 52 = 28 であり、3 × 52 = 75 となる。演算順序を変えたい場合、かつては括線(オーバーラインまたは下線)を使っていた。今日では括弧を使って、先に評価すべき式の部分を明示的に囲む。したがって、乗法の前に加法を行うなら (2 + 3) × 4 = 20 などとし、冪乗の前に加法を行うなら (3 + 5)2 = 64 などとする。
目次 |
標準的な演算子の優先順位 [編集]
ここで示している演算子の優先順位は、数学・科学・工学全般で通用しており、多くのプログラミング言語でも同様である[2]。
これの意味するところは、例えばある数式の項の前後にそれぞれ異なる演算子があった場合、上記一覧の上の方(数字の若い方)にある演算子を先に適用すべきだということである。加法と乗法の交換および結合法則により、項の加算は任意の順序で可能であり、乗数も任意の順序で乗算可能だが、それらが混在している場合は標準の優先順位に従わなければならない。
除法を逆数による乗法として扱うことができ、減法を加法的逆元の加法として扱うことができる。すなわち、3/4 = 3 ÷ 4 = 3 • ¼ である。言い換えれば、3を4で割った商は、3と ¼ をかけた積と等しい。同様に 3 − 4 = 3 + (−4) であり、3と4の差は正の3と負の4の和と等しい。この理解により、 1 − 3 + 7 という式は1と負の3と7の和とみなすことができ、任意の順序で計算可能である。すなわち (1 − 3) + 7 = −2 + 7 = 5 と計算することもできるし、 (7 − 3) + 1 = 4 + 1 = 5 と計算することもできる。項の順序を入れ替える際、負号を常に3に付属させることが重要である。
平方根記号 √ は被開数(平方根を求める対象となっている数)をグループ化する記号を必要とする。通常使われるグループ化の記号は被開数の上にひかれる横線(括線)である。他の一般的関数は曖昧さを防ぐために入力を括弧で囲むが、入力が単項式であれば括弧を省くこともある。例えば、sin x = sin(x) だが、sin x + y = sin(x) + y となる。なぜなら x + y が単項式でないためである。計算機では、一般に全ての関数の入力を括弧で囲む必要がある。
冪指数が積み重なっている場合、一番上の冪乗から計算する。
グループ化の記号は通常の演算子の優先順位を無効にすることができる。グループ化された部分は1つの式として扱うことができる。交換および分配法則を使えばグループ化記号を排除することができる。
例 [編集]
水平な線分(括線)はグループ化記号として機能する。
読みやすくするため、通常の丸括弧 ( ) だけでなく、角括弧 [ ] や波括弧 { } をグループ化記号として使うことがある。例えば次のような式である。
例外 [編集]
単項演算子としてのマイナス記号(負号)の扱い方はいくつかある。普通に書いた場合、−32 は −(32) = −9 を意味するが[3]、数式を扱うアプリケーションやプログラミング言語(特に Microsoft Office Excel やプログラミング言語bc)では単項演算子を二項演算子より優先しているためマイナス記号は冪乗より優先順位が高く、−32 は (−3)2 = 9 と解釈される[4]。誤解が生じる可能性がある場合、括弧を使って意味を強調するのが一般的である。
同様にスラッシュ記号 ('/') を数式で 1/2x のように使う際にも曖昧さがある。これを 1 ÷ 2 × x の意味で書いているなら、除算記号を分数を使った乗算で表現していると解釈でき、次のようになる。
すなわちこの解釈では、1/2x を 1/(2x) ではなく (1/2)x と等価とみなしていることになる。しかし書籍などでも、演算子を使わない暗黙の乗法を除法より優先すると解釈している場合があり、1/2x は (1/2)x ではなく 1/(2x) と解釈している。例えばフィジカル・レビュー誌の論文投稿要綱では、スラッシュで表される除法より乗法の優先順位が高いとしており[5]、ランダウとリフシッツの『理論物理学教程』やファインマンの教科書などでも同様の慣習が見られる[6]。さらに Wolfram Alpha では、括弧付きでない暗黙の乗法は除法より優先されるが、演算子を明示した乗法や括弧付きの暗黙の乗法はそうではないとしている。例えば、2*x/2*x と 2(x)/2(x) は x2 となるが、2x/2x は1になる[7]。TI-89電卓では、3例とも x2 となる。
一般に曖昧な解釈が可能な数式は避けることが推奨されており、可能ならスラッシュではなく分数の形で記述すべきであり、そうでなくとも括弧を使って曖昧な解釈ができない形にすべきである。
記憶術 [編集]
欧米では、演算子の優先順位を覚えるための記憶術があるが、その頭字語を使った記憶術のせいで間違って覚えることがある。アメリカでは PEMDAS (Parentheses, Exponents, Multiplication, Division, Addition, Subtraction) という頭字語を使う。これを "Please Excuse My Dear Aunt Sally" という文で覚える(各単語の頭文字が所定の順序で並んでいる)。カナダでは BEDMAS、イギリスでは BIDMAS または BODMAS である。Bは Brackets、Iは Indices、Oは Orders を意味する。
これには乗法と除法、加法と減法に優先順位の上下関係があるかのような錯覚を与える欠点があり、そのように覚えてしまうと
という式を9ではなく5と計算してしまう可能性がある。
そのためニュージーランドでは、PEMA と教えている場合もある。この場合除法と減法が入っておらず、それぞれ乗法と加法と優先順位が等しいことを別途教える。
特殊な例 [編集]
階乗は感嘆符で表され、その直前(左)にある項に適用される。括弧が関わらない限り、階乗は優先的に計算される。ただし、23! は (23)! = 8! = 40320 を意味するが、23! は 26 = 64 となる。
冪乗が積み重なっている場合、上から計算する。すなわち次のようになる。
中黒を乗法の記号として使うこともあり、その場合は中黒より前の式全体と中黒より後の式全体の乗法を意味することがあるが、この記法は誤解されやすい。すなわち x + y • a + b は (x + y)(a + b) を意味するが、後者の記法がより一般的である。
電卓 [編集]
電卓は機種によって演算子の優先順位が異なる場合がある。スタックを使っていない安価な電卓では、入力した順に優先順位をつけることなく計算する。例えば
となるが、より洗練された電卓では標準の優先順位に従い
となる。Microsoft Windowsの電卓は、表示が「普通の電卓」の場合は前者、「関数電卓」の場合は後者の動作をする。
関数電卓でない普通の電卓は、数値-演算子-数値の順序で入力し、次の演算子のボタンを押下した際にそれまで入力した式がすぐさま評価され、新たな演算子の右辺値となる。もっと賢い電卓では、式全体が入力されるまで評価せず、必要に応じてグループ化を行い、等号ボタンを押下したときだけ式を評価する。
冪乗を計算できる電卓の場合、冪乗の結合性が左右どちらなのかは機種によって異なる。例えば、TI-92とTI-30XIIで a ^ b ^ c を計算した結果は異なる。
TI-92では冪乗は右結合性なので次のようになる。
-
- a ^ b ^ c = a ^ (b ^ c) =

- a ^ b ^ c = a ^ (b ^ c) =
一方TI-30XIIでは左結合性なので次のようになる。
-
- a ^ b ^ c = (a ^ b) ^ c =

- a ^ b ^ c = (a ^ b) ^ c =
また 1/2x のような式は、TI-82では 1/(2x) と解釈されるが、TI-83では (1/2)x と解釈される[8]。
プログラミング言語 [編集]
多くのプログラミング言語は数学で使われている標準的な優先順位に従う。しかし、中にはAPLやSmalltalkのように演算子の優先順位を持たない言語もある(APLでは厳密に右から左へと評価していく。Smalltalkでは、厳密に左から右へと評価していく)。
C言語のビット演算や論理演算の優先順位は低く設定されているが、開発者はこれに満足していなかった[9]。しかし、C++、Perl、PHPなどの多くの言語がC言語での優先順位設定を踏襲しており、プログラマはそれに慣れていることが多い。C言語風の言語における演算子の相対的優先順位は次の通りである。
| 1 | () [] -> . :: | グループ化、スコープ、配列要素/メンバへのアクセス |
| 2 | ! ~ - + * & sizeof type cast ++x --x | ほとんどの単項演算子など |
| 3 | * / % | 乗法、除法、剰余 |
| 4 | + - | 加法、減法 |
| 5 | << >> | ビット単位のシフト |
| 6 | < <= > >= | 大小比較 |
| 7 | == != | 等価/非等価比較 |
| 8 | & | ビット単位のAND |
| 9 | ^ | ビット単位の排他的OR |
| 10 | | | ビット単位の通常のOR |
| 11 | && | 論理AND |
| 12 | || | 論理OR |
| 13 | ?: = += -= *= /= %= &= |= ^= <<= >>= | 条件式と代入 |
| 14 | , | コンマ演算子 |
例:
!A + !B≡(!A) + (!B)++A + !B≡(++A) + (!B)A + B * C≡A + (B * C)A || B && C≡A || (B && C)(A && B == C)≡(A && (B == C) )
ソフトウェア開発者が二項演算子の優先順位について持っている知識の精度は、それら演算子がソースコードに出現する頻度と密接に関係していることが示されている[10]。
脚注 [編集]
- ^ “Ask Dr. Math”. Math Forum (2000年11月22日). 2012年3月5日閲覧。
- ^ “Order of Operations Lessons”. Algebra.Help. 2012年3月5日閲覧。
- ^ [Allen R. Angel, Elementary Algebra for College Students 8/E; Chapter 1, Section 9, Objective 3]
- ^ “Formula Returns Unexpected Positive Value”. Support.microsoft.com (2005年8月15日). 2012年3月5日閲覧。
- ^ “Physical Review Style and Notation Guide”. American Physical Society. 2012年8月5日閲覧。
- ^ 例えば、『理論物理学教程』第1巻「力学」第3版には、hPz/2π (p. 22) という式があり、スラッシュを最後に評価するという意味で書かれている。
- ^ “2x÷2x - Wolfram|Alpha”. Wolframalpha.com. 2012年3月5日閲覧。
- ^ “Implied Multiplication Versus Explicit Multiplication on TI Graphing Calculators”. Texas Instruments Incorporated (2011年1月16日). 2011年4月29日閲覧。
- ^ Dennis M. Ritchie: The Development of the C Language. In History of Programming Languages, 2nd ed., ACM Press 1996.
- ^ "Developer beliefs about binary operator precedence" Derek M. Jones, CVu 18(4):14–21


![[(1+2)-3]-(4-5) = [3-3]-(-1) = 1 \,](http://upload.wikimedia.org/math/a/5/9/a5983f660c7ddd1bb7a219dfbaa409e4.png)






