« 演算子 | メイン | 定数とエスケープ記号 »

演算子の優先順位と結合性

スクリプトのステートメントは、左から読んで順に実行するとは限りません。ステートメントの読み方、すなわち演算の実行の順番は、演算子の優先順位と結合性によって決まります。

■演算子の優先順位
同一ステートメントで複数の演算子を使っている場合、演算子の優先順位によって演算の順番が決まります。わかりやすい例としては次のような加減乗除の演算子を使った式があげられます。

例:
a = 8 + 2 * 3 - 10 / 5;

このステートメントでは*と/の優先順位が+と-より高いので、*と/の演算が先に実行されます。これはカッコを使った次の式と同様になります。多くの場合はカッコを使うことで演算の順番をわかりやすく示すことができます。

例:
a = 8 + (2 * 3) - (10 / 5);

■演算子の結合性
演算子の結合性とは、「a = b = c」のように同一の演算子がオペランドをはさんでつながっているときに、右から左へ実行(←)するか、左から右へ実行する(→)かを示すものです。
たとえば、「a = b = c」では=の結合性は「右から左へ」なので、まずbにcの値を代入し、次にaにbの値を代入します。結果として、a、b、cは同じ値になります。カッコを使って書くと「a = (b = c)」のように実行することになります。

例:
a = 1;
b = 2;
c = 3;
a = b = c;
// a、b、cのすべてが3になる

演算子を優先順位が高い順から並べると次のようになります。演算子の結合性は、右から左へと実行していくものを←、左から右へと実行していくものを→と記してあります。


演算子  説明    結合性
+  プラス符号    ←
-  マイナス符号    ←
~  ビット単位の論理否定 (NOT)  ←
!   論理否定 (NOT)    ←
not   論理否定 (NOT)    ←
++   ポストインクリメント    →
--   ポストデクリメント    →
( )    関数(パラメータを囲む)   →
[ ]   配列エレメント    →
.   構造体メンバー参照    →
++   プリインクリメント   ←
--  プリデクリメント   ←
new  オブジェクトの割り当て   ←
delete  オブジェクトの割り当て解除  ←
typeof  オブジェクトの種類   ←
void  未定義の値を返す   ←
*  乗算     →
/  除算     →
%  剰余     →
+  加算、 ストリングの連結  →
add  ストリングの連結   →
-  減算     →
<<  ビット単位の左シフト   →
>>  ビット単位の右シフト   →
>>>  ビット単位の右シフト (符号なし)  →
<  より小さい    →
<=  以下     →
>  より大きい    →
>=  以上     →
instanceof インスタンス    →
lt  より小さい    →
le  以下     →
gt  より大きい    →
ge  以上     →
==  等しい     →
!=  等しくない    →
eq  等しい     →
ne  等しくない    →
&  ビット単位の論理積 (AND)  →
^  ビット単位の排他的論理和 (XOR)  →
|  ビット単位の論理和 (OR)   →
&&  論理積 (AND)    →
and  論理積 (AND)    →
||  論理和 (OR)    →
or  論理和 (OR)    →
?:  三項演算    ←
=  代入     ←
*=、/=、%=、 複合代入    ←
+=、-=、&=、
|=、^=、<<=、
>>=、>>>=
,   カンマ     →

投稿者 oshige : 2005年2月12日 10:39