第3回では変数とデータ型についての学習をしました。今回は演算子について解説していきます。

演算子とは

Javaでは、さまざまな演算を行うための演算子が用意されています。演算子には加算や減算などの四則演算を行うものや、値を比較するものなど、さまざまな種類があります。ここでは各演算子の使い方について解説していきます。

算術演算子

数値を計算する場合には「算術演算子」を使用します。算術演算子には次のものがあります。


  1. + :足し算
  2. -  :引き算
  3. *  :掛け算
  4. /  :割り算
  5. % :剰余(余り)

・算術演算子を使用した例

// 整数の演算
int num;

num = 6 + 4; // num = 10
num = 8 - 2; // num = 6
num = 6 * 2; // num = 12
num = 5 / 2; // num = 2
num = 5 % 2; // num = 1

// 浮動小数点数の演算
double d; // double型の変数

// どちらかが浮動小数点数であった場合、得られる結果も浮動小数点数
d = 10 / 8;      // d = 1.0
d = 10.0 / 8;   // d = 1.25
d = 10 / 8.0;   // d = 1.25
d = 10.0 / 8.0; // d = 1.25 

・除算の注意点

除算をする場合、数値を0で割ってしまうと例外が発生するので注意してください(※例外については今後の記事で解説します)。

単項演算子

数値の正と負を反転させるためには「単項演算子」を使用します。単項演算子には次のものがあります。


  1. + :正負をそのまま(単項プラス演算子)
  2. -  :正と負を反転(単項マイナス演算子)

単項演算子として使用する場合は演算の対象がひとつとなります。単項マイナス演算子は演算子の右側にある値の、正と負を反転させます。

・単項演算子を使用した例

int num1, num2, num3;

num1 = 5;
num2 = -num1; // num2 = -5

num3 = -8;

int n1, n2;

n1 = 5;   // +の場合は記述しなくても良い
n2 = +n1; // n2 = 5

演算子の優先順位

ひとつの式の中に複数の演算子があった場合の優先順位について解説します。演算子の優先順位と結合規則は次のとおりです。

演算子の優先順位と結合規則

上に書かれているほど優先順位が高く、下になるほど優先順位は低くなります。

・演算子の優先順位の例

int num;
num = 2 + 5 * 4;

上記の場合、最初に「5 * 4」の演算が行われ、次に「2 + 20」の演算が行われます。そして「=」によって変数「num」に22が代入されます。

int num;
num = 2 + 5 - 4;

上記の場合、「+」と「-」は優先順位が同じため、「2 + 5」の演算が行われ、次に「7 - 4」の演算が行われます。そして「=」によって変数「num」に3が代入されます。

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

演算子の優先順位に関係なく特定の演算を優先させたい場合、式の一部分を括弧でくくることにより、優先的に演算を行わせることができます。

・優先順位の変更の例

int num;
num = 3 + 2 * 4; // 優先順位に従った演算

上記の場合、「*」の方が「+」よりも優先順位が高いため「2 * 4」の演算が先に行われます。

int num;
num = (3 + 2) * 4; // 優先順位を変更した演算

括弧で囲まれた箇所の演算は優先的に行われます。上記の場合、先に「3 + 2」が演算され、次に「5 * 4」が演算されます。

int num;
num = (6 + 8 / 2) * 2; // 括弧の中に複数の演算子が含まれていた場合の演算

上記の場合、まず括弧の中の「6 + 8 / 2」が演算されます。括弧の中に「+」と「/」があるので、先に「8 / 2」が演算されます。

インクリメント・デクリメント演算子

数値をひとつだけ増加させたり、減少させたりするために用意された演算子が「インクリメント演算子」(++)と「デクリメント演算子」(--)です。


  1. ++ :値を1増加させる → a++ または ++a
  2. -- :値を1減少させる → a-- または --a

・インクリメント/デクリメント演算子を使用した例

int num = 5;
num++; // 変数の値を1つだけ増加させる

int num = 5;
num--; // 変数の値を1つだけ減少させる

「++」演算子や「--」演算子は対象となる変数の値を変化させるので、演算結果を変数に代入する必要はありません。

・前置と後置

インクリメント演算子とデクリメント演算子にはそれぞれ前置と後置があります。インクリメント演算子の前置と後置は次のようになります。


前置: ++変数

後置: 変数++

デクリメント演算子の前置と後置は次のようになります。


前置: --変数

後置: 変数--

・前置の例

int num1 = 5;
int num2;

num2 = ++num1; // 変数「num1」を1だけ増加させてから変数「num2」に変数「num1」を代入
System.out.println(num1); // 6
System.out.println(num2); // 6

・後置の例

int num1 = 5;
int num2;

num2 = num1++; // 変数「num2」に変数「num1」を代入してから変数「num1」 の値をひとつだけ増加させる
System.out.println(num1); // 6
System.out.println(num2); // 5

前置と後置で違う結果が出る場合がありますので、インクリメント/デクリメントを使用する際には注意してください。

ビット演算子

整数の値に対してビット単位で処理を行うために用意されているのが「ビット演算子」です。ビット演算子には次のようなものがあります。


  1. & :ビットAND ビット単位の論理積
  2. | :ビットOR ビット単位の論理和
  3. ^ :ビットXOR ビット単位の排他的論理和
  4. ~ :ビット反転(ビットNOT)
  5. << :左へ3ビットシフト
  6. >> :右へ3ビットシフト(符号あり)
  7. >>> :右へ3ビットシフト(符号なし)

数値を2進数の形式で表示し、各ビットに対して演算を行います。

シフト演算子

ビット演算子のなかでも下記の3つは「シフト演算子」と呼ばれることもあります。


  1. << 左へ3ビットシフト
  2. >> 右へ3ビットシフト(符号あり)
  3. >>> 右へ3ビットシフト(符号なし)

これらの3つの演算子は、対象の値の各ビットを右または左へシフトします。

代入演算子

変数に値を代入する時には代入演算子(=)を使用します。「=」の右辺に書かれた値や変数などを左辺に書かれた変数に代入します。代入演算子「=」と別の演算子を組み合わせて記述することもできます。

  1. +=
  2. a += b → a = a + b と同じ

  3. -=
  4. a -= b → a = a - b と同じ

  5. *=
  6. a *= b → a = a * b と同じ

  7. /=
  8. a /= b → a = a / b と同じ

  9. %=
  10. a %= b → a = a % b と同じ

  11. &=
  12. a &= b → a = a & b と同じ

  13. |=
  14. a |= b → a = a | b と同じ

  15. ^=
  16. a ^= b → a = a ^ b と同じ

  17. <<=
  18. a <<= b → a = a << b と同じ

  19. >>=
  20. a >>= b → a = a >> b と同じ

  21. >>>=
  22. a >>>= b → a = a >>> b と同じ

関係演算子と論理演算子

今後の記事(if文)で説明します。

条件演算子(三項演算子)

条件演算子(三項演算子)とは、条件によって処理を分岐させることができる演算子です。


条件式 ? 式1 : 式2

条件式の結果がtrue(真)だった場合には式1を処理し、false(偽)だった場合に式2を処理します。

・条件演算子(三項演算子)を使用した例

char c;
int i;

i = 10;
c = i >= 0 ? 'X' : 'Y';

最初に、条件式に記述された「i >= 0」を評価します。変数「i」の値は10なので、条件式はtrue(真)となります。そのため「'X'」という式が処理されます。今回の場合は単なる値が書かれただけの式なので何もしませんが、条件演算子では実行された式の値が全体の式の値となります。その結果、変数「c」には式全体の値である'X'が代入されます。条件によって処理を分ける場合、多くのケースではif文を使いますが、簡単なものであれば条件演算子を使ったほうがシンプルになることがあります。

文字列の連結

文字列同士を連結する場合は「+」演算子を使用します。

・文字列の連結の例

String msg = "Hello," + "World";
System.out.println(msg); // Hello,World

また、下記のようにString文字列とそれ以外の型を連結した場合、結果はString型となるので注意してください。

int year = 2015;
String msg = "This year is " + year;
System.out.println(msg); // This year is 2015

今回は演算子について解説しました。次回もJavaの基本構文について解説していく予定です。

執筆者紹介

八重桜雅子(YAEZAKURA Masako)

以前はシステム開発会社で約8年間働いていました。JavaやJavaScriptなどのWeb系の技術をよく使用していました。