演算子の優先順位

広告

演算子を使った演算を行う場合、演算子が単独で使用される「5 + 2」や「8 / 4」のようなものであればいいのですが、「5 + 3 * 4」などのように演算子を複数使用した複雑な演算も可能です。この時に注意するのが演算子の優先順位です。

例えば次の例を見てください。

5 + 3 * 4

先に「5 + 3」が行われた場合、次に「8 * 4」が行われて結果は「32」となります。また「3 * 4」が先に行われた場合、次に「5 + 12」が行われて結果が「17」となります。このようにどの演算を先に行うかで結果が異なる場合があります。

そこで演算子には優先順位が設定されています。1つの式の中に複数の演算子が含まれていた場合は、優先順位の高い演算子から演算が行われます。各演算子の優先順位は次のようになっています。

(優先順位が高い)
  +  -  ~x      (+と-は単項演算子)
  **
  *  /  %  //
  +  -
  <<  >>
  &
  ^
  |
  <  <=  >  >=  ==  !=  <>  is  is not  in  not in
  not
  and
  or
(優先順位が低い)

最も高い優先順位を持つのが「+」と「-」です。(この「+」と「-」は符号を表す単項演算子です)。逆に最も低い優先順位を持つのが「or」です。四則演算以外の演算子については今後解説していきます。

そこで改めて先ほどの例を見てみます。

5 + 3 * 4

ここで使われている演算子は「+」と「*」です。この演算子では「*」の方が優先順位が高いので先に演算が行われます。よって上記の結果は「17」となります。

また同じ優先順位の演算子に優先順位に違いがありません。例えば「+」と「-」の優先順位は同じです。同じ優先順位が使われていた場合は左から順に演算が行われます。

5 + 3 - 4

上記の場合は「+」と「-」の優先順位は同じですので左にある演算子から演算が行われます。よって「5 + 3」が演算され、次に「8 - 4」が演算されます。

括弧()を使った優先順位の変更

演算子の優先順位とは異なる順序で演算を行いたい場合には括弧()を使用します。括弧で囲まれた演算は先に演算が行われます。

5 + 3 * 4
(5 + 3) * 4

括弧が無い場合は「*」が優先順位が高いため先に「3 * 4」が実行されます。それに対して括弧()が式の中に含まれている場合は、先に括弧の中の演算が行われます。よって下の式では「5 + 3」が先に実行され、その次に「8 * 4」が実行されることになります。

括弧の中に複数の演算子が使われている場合は演算子の優先順位によって演算が行われます。また括弧が多重に使用されている場合は内側の括弧が先に演算されます。

2 * ((5 + 3 * 2) * 4 - (4 + 5) / 3)

上記の場合は次のように演算が行われます。

(1) 3 * 2 = 6       =>  2 * ((5 + 6) * 4 - (4 + 5) / 3)
(2) 5 + 6 = 11      =>  2 * (11 * 4 - (4 + 5) / 3)
(3) 4 + 5 = 9       =>  2 * (11 * 4 - 9 / 3)
(4) 11 * 4 = 44     =>  2 * (44 - 9 / 3)
(5) 9 / 3 = 3       =>  2 * (44 - 3)
(6) 44 - 3 = 41     =>  2 * 41
(7) 2 * 41 = 82

複雑な式であっても優先順位と括弧、そして同じ優先順位の場合は左から順に演算が行われると規則に従って、必ず演算が行われる順序は1つに決まります。

サンプルコード

では実際に試してみます。

#coding: UTF-8

print "5 + 3 * 4 = ", 5 + 3 * 4
print "(5 + 3) * 4 = ", (5 + 3) * 4
print "2 * ((5 + 3 * 2) * 4 - (4 + 5) / 3) = ",
print 2 * ((5 + 3 * 2) * 4 - (4 + 5) / 3)

上記を「test3-1.py」として保存します。保存する時の文字コードはUTF-8です。そして次のように実行して下さい。

演算子の優先順位

( Written by Tatsuo Ikura )