演算子の優先順位

各種演算子には、数学で言う()のような優先順位があります。この優先順位を理解していないと、想定した通りの処理が行われないので注意が必要です。

演算子の優先順位 目次

  1. 演算子の優先順位
  2. 演算子の優先順位一覧
  3. 非短絡の&&とは

1.演算子の優先順位

演算子は、カテゴリに分けると①単項演算子、②四則演算などの計算用、③関係演算子、④論理演算子、⑤代入演算子、と5つに分けることができます。ちなみに①は単項演算子(オペランドが1つ)であり、それ以外の②~⑤は2項演算子(n項演算子とも言う)になります。

演算子の優先順位(同時に記述した際にどちらが先に実行されるか)は、この①~⑤の順になります。

<演算子の優先順位>
優先順位 演算子
高い 単項演算子 !hensu、1++、など
計算用演算子 1 + 2、hensu * 3、など
  関係演算子 hensu >= 20 など
論理演算子 A && B など
低い 代入演算子 hensu = 10 など

2.演算子の優先順位一覧

先ほどの演算子を、一つ一つ列挙して一覧にすると次の様になります。

<演算子の優先順位一覧>
カテゴリ 種類 演算子
単項演算子 後置インクリメント・デクリメント ++ –
前置インクリメント・デクリメント ++ –
単項プラス・マイナス + -
論理否定 !
キャスト(型変換) (型)
計算用演算子 乗算、除算、剰余算 * / %
加算、減算 + -
文字列連結 +
関係演算子 値の大小の比較 < > <= >=
等号、不等号 == !=
論理演算子 非短絡の&& &
排他的論理和 ^
非短絡の|| |
論理積 &&
論理和 ||
代入演算子 代入演算子 =

3.非短絡の&&とは

上の表で、非短絡の&&(&)と言うのが出てきましたが、これはどういうことかと言うと、通常&&(論理積)は、条件A&&条件Bなどのように記述します。条件Aがtrueであり、かつ条件Bもtrueの時だけ、A&&Bの結果もtrueになります。

と言うことは、もし条件Aがfalseならば、条件Bを評価するまでもなく、A&&Bはfalseであることが分かっています。&&ならば、こういう時に条件Bの評価をしませんが、&ならば必ず条件Bも評価されてしまいます。

両方ともtrueの時しか結果はtrueにならない、それじゃぁ条件Aがfalseだったら条件Bは評価する必要無いよね?というのが(&&)短絡的であるとした場合に、いやいや、ちゃんと全部評価しないといけないでしょ、と言うのが(&)非短絡であるという表現になります。

お分かりかと思いますが、非短絡である&は無駄なので普通は使う必要がありません。また、非短絡の|も同じことになります。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		int intHensu1 = -1;
		int intHensu2 = -1;
		
		// 短絡的な評価(&&)の場合、++intHensu2は評価(実行)されない
		System.out.println( ++intHensu1 > 0 && ++intHensu2 > 0);
		System.out.println( intHensu1);
		System.out.println( intHensu2);
	}
}
----------------------------------------------------------------------
false
0
-1

短絡的な&&

非短絡な場合は、評価をする必要が無いと分かっていても、評価を行います。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		int intHensu1 = -1;
		int intHensu2 = -1;
		
		// 非短絡的な評価(&)の場合、++intHensu2も評価(実行)される
		System.out.println( ++intHensu1 > 0 & ++intHensu2 > 0);
		System.out.println( intHensu1);
		System.out.println( intHensu2);
	}
}
----------------------------------------------------------------------
false
0
0

非短絡の&

コメントを残す

サブコンテンツ

このページの先頭へ