検索

キーワード


【Java】演算子(算術演算子と複合演算子)の使い方を解説! インクリメントとデクリメントの使い方!

  • 公開日:2020-09-04 11:49:02
  • 最終更新日:2021-01-25 17:38:53
【Java】演算子(算術演算子と複合演算子)の使い方を解説! インクリメントとデクリメントの使い方!

こんにちは。駆け出しプログラマーの松倉です!

ここでは、演算子の基本である算術演算子と複合演算子ついて紹介・解説します。

プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 

関連記事リンク:【Java】変数とは?定数とは?詳しく解説! 変数の列挙型、代入、型変換、型推論の使い方についても紹介します!【Java】リテラルってなに? リテラル(数値、文字、文字列)の使い方を解説!【Java】比較演算子、論理演算子、ビット演算子、シフト演算子の使い方について解説!


Java で使用する演算子の種類

値を使った計算のことを演算と呼びます。

+(プラス)や -(マイナス)などのプログラムで計算を行うための記号や、複数の値の比較を行うための記号など何らかの演算を行う記号を演算子(オペレーター)といいます。

演算の方法は演算子によって区別されます。

Javaでは全部で 40個ほどの演算子が用意されています。


この記事では演算子について以下のことを紹介・解説を行います。

算術演算子 (四則演算など)

代入演算子 (複合代入演算子、インクリメント/デクリメント)

   複合代入演算子(再帰代入演算子)

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

    前置/後置

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



算術演算子 (四則演算など)

最も基本的な演算は足し算、引き算、掛け算、割り算です。

この 4つの演算は一般的に「四則演算」と呼ばれます。

この四則演算に割り算をした時の余りの計算をする演算を加えた計 5つの演算子が算術演算子です。

足し算と引き算は日常で使われる「+ , -」の記号が使われていますが、掛け算と割り算の場合「× , ÷」の記号は使われていません。

コンピューターでは掛け算は「*」、割り算は「/」、割り算の余りは「%」の記号が使われます。

int num;
num = 1 + 2;   //加算
num = 8 - 4;   //減算
num = 5 * 6;   //乗算
num = 7 / 3;   //除算
num = 7 % 3;   //剰余

数値を 0で除算したり、数値を 0で割った余りを取得したりすることをゼロ除算といいます。

整数を 0で割ったり 0で割った余りを取得すると、実行時に「java.lang.ArithmeticException: / by zero」というエラーが発生します。

プログラムを記述する場合は、0で除算、剰余しないように注意しましょう。



代入演算子 (複合代入演算子、インクリメント/デクリメント)

代入演算子は、「=」で表され、右変の値を左辺の変数に代入するものです。

int a,b,c;
a = b = c = 10; 


「=」で変数を連結するとすべての変数を同じにすることができ、右結合のため代入は右端から下記の順番のように実行されます。

1, c = 10
2, b = c
3, a = b 


以下のように変数宣言時の初期化で使用するとコンパイルエラーが発生します。 

int c = b = a = 5;

代入演算と関係する複合代入演算子(再帰代入演算子)とインクリメント/デクリメント演算子の説明をします。



複合代入演算子(再帰代入演算子)

複合代入演算子は、代入演算子と+(プラス)や -(マイナス)など組み合わせた演算子です。

左辺の変数と右辺の値を演算した結果を、もう一度同じ変数に代入します。

Javaは 11個の複合代入演算子が用意されています。

この記事ではよく使われる5つの算術演算子と代入演算子の組み合わせた複合代入演算子を紹介します。

               よく使われる複合代入演算子の一覧

変数の計算結果を同じ変数に代入を行う場合、複合代入演算子を利用するとより簡潔に記述することができます。

通常の代入演算子と同じく、複合代入演算子による演算はその右辺をすべて演算した後に行われます。

 

算術演算子と代入演算子の組み合わせた複合代入演算子をサンプルコードで確認しましょう。

public class Sample1 {
	public static void main(String[] args) {
		int num;
		num = 10;
		System.out.println(num);

		num += 5;
		System.out.println(num);

		num *= 2;
		System.out.println(num);

		num /= 3;
		System.out.println(num);
	}
}


実行結果:

10
15
30
10

複合代入演算子を使った演算結果が確認できました。



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

インクリメントとデクリメント演算子は、それぞれ「1を足す」「1を引く」という処理に特化した複合代入演算子です。

「++」で値を 1足すことをインクリメント、「--」で値を1引くことをデクリメントといいます。

int a =5;
++a;
--a;

変数の数値を 1増やすまたは減らす演算子のため、整数リテラルや浮動小数点数リテラルに対してこの演算子を使うことはできません。



前置/後置

変数の左に演算子を置く書き方を「前置」、右に演算子を置く書き方を「後置」と呼びます。

「++a」の前置と「a++」の後置という記述の仕方があります。

どちらも「aの値を 1増やす」という処理ですが、両者には違いがあります

変数のインクリメント後の値はどちらも同じですが、値を変化させるタイミングがそれぞれ異なるため、変数には異なる値が代入されることになります。

式の中で使ったときに、「前置」では演算の後の値が用いられ、「後置」では演算の前の値が用いられます。

int a = 5;
//前置
++a;
--a;
//後置
a++;
a--;  


インクリメント演算子やデクリメント演算子を使った演算を行った結果を別の変数に代入する場合、前置と後置どのような違いがあるのか見てみましょう。

前置を使った場合、変数 aの値を 1増やしたあとで増えたあとの値が変数 bに代入されます。

b = ++a;  →  a = a + 1;
             b = a; 

後置を使った場合、変数 aの値が 1増える前の値がまず変数 bに代入され、その後で変数 aの値が 1増えます。

b = a++;  →  b = a;
             a = a + 1; 

値を変化させるタイミングが前置と後置でそれぞれ異なるため計算結果が異なります。


インクリメント演算子の前置と後置よる演算の計算結果の違いをサンプルコードを確認しましょう。

public class Sample2 {
	public static void main(String[] args) {
		int a1 = 5;
		int b1;
		b1 = ++a1;
		System.out.println("---前置---");
		System.out.println(a1);
		System.out.println(b1);

		int a2 = 5;
		int b2;
		b2 = a2++;
		System.out.println("---後置---");
		System.out.println(a2);
		System.out.println(b2);
	}
}


実行結果:

---前置---
6
6
---後置---
6
5

前置と後置によって演算の計算結果が異なることが確認出来ました。

インクリメント演算子とデクリメント演算子を使用する場合は、前置と後置のどちらを使用したら自分が思った通りの演算を行ってくれるのかを考えて使いましょう。



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

演算がどの順番で行われるのかは演算子の優先順位と結合規則によって決まります。

優先順位はどの演算が先に行われるのかを決定するのに使われ、結合規則は優先順位が同じ演算子だった場合にどの演算が先に行われるのかを決定するのに使います。


演算子の優先順位

  1. (引数)、[]、.、++、–(後置)
  2. !、~、+、-(単項)、++、–(前置)
  3. new、( キャスト )・*、/、%
  4. +、-(算術)
  5. <<、>>、>>>
  6. >、>=、<、<=、
  7. ==、!=
  8. &
  9. ^
  10. |
  11. &&
  12. ||
  13. ?:
  14. =、+=、-=、*=、/=、% =、&=、^=、|=、<<=、>>=、>>>=

上が優先順位が高く、下が優先順位は低くなり、同じ行に書かれている演算子は優先順位に違いはありません

「*」と「+」の場合「*」の方が「+」よりも優先順位が高くなっています。

そのため同じ式の中で「*」と「+」の 2つの演算子がある場合、先に「*」の演算が行われます。


先に演算させたい演算子がある場合には括弧()を使います。

例1)括弧で囲まれた中の演算は、優先順位に関係なく優先的に行われます。

int num;
num = (2 + 3) * 4;


実行結果:

20

上記の例では「2 + 3」が先に演算され、次に「5 * 4」が演算されます。


例2)括弧の中に複数の演算子が含まれていた場合には、括弧の中だけで演算子の優先順位や結合規則を使って演算する順番が決まります。

int num;
num = ( 5 - 1 * 2 + 3 ) * 4;


実行結果:

24


例3)括弧の中にさらに括弧が含まれていた場合にはより内側の括弧から演算が行われます。

int num;
num = (2 * (3 + 9)) / 4;


実行結果:

6



まとめ

今回の記事では基本的な演算子について紹介・解説しました。

複合代入演算子を利用するとコードをより簡潔に記述することができ、可読性が向上します。

インクリメント/デクリメント演算子は前置と後置があるため、理解して使い分けができるまでは不安があると思います。

この記事でぜひ覚えておきましょう!

演算子の優先順位も複数の演算子がある式ではない限りそこまで気にすることはありません。

何気なく使っている演算子ですが、使い方ひとつで様々なメリットがあるのでどんどん使ってみましょう!


関連記事リンク:【Java】変数とは?定数とは?詳しく解説! 変数の列挙型、代入、型変換、型推論の使い方についても紹介します!【Java】リテラルってなに? リテラル(数値、文字、文字列)の使い方を解説!【Java】比較演算子、論理演算子、ビット演算子、シフト演算子の使い方について解説!

【著者】

松倉祥大

はじめまして。フォワードソフト株式会社の松倉です。
システムエンジニアとして働き始めたのが2020年4月です。経験や知識がない状態で入社した私は、フォワードソフトの教育研修で一からプログラミングの勉強をしました。教育研修を卒業後、Javaのプログラミングについて初学者向けの記事を共同で制作しています。
知識や経験はまだまだですが、これからいろんな職場で様々な経験しながら勉強していきたいと思っています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様