Javaの基礎知識(基礎編)

【Javaの基礎知識】演算子の基本と使い方を徹底解説!

Javaには、多くの演算子が用意されています。Javaに限らず今日のプログラムの発展は、条件分岐、繰り返しループ処理、そしてこれから学習する演算子の組み合わせにより導き出された回答をもとに急速に発展したと言っても過言ではありません。

本記事では、Javaの演算子の種類とその使い方を詳しく解説します。初心者にもわかりやすく、実践的な例を交えながら解説するので、Javaの基本をしっかりと理解しましょう。

Javaの演算子とは?

演算子とは、プログラムの中でデータを操作するための記号のことです。Javaでは、数値計算や条件比較、変数の代入など、さまざまな処理を行うために演算子が使用されます。 Javaの演算子を理解することで、効率的なコードを記述できるようになります。

演算子の役割

Javaの演算子は、以下のような処理を行う際に使用されます。

  • 数値や変数の計算(加算・減算・乗算・除算など)
  • 条件の比較(大小比較・等価比較など)
  • 変数の値を変更(代入・インクリメント・デクリメントなど)
  • 論理演算(AND・OR・NOTなどの条件制御)
  • ビット演算(ビット単位のAND・ORなど)

例えば、2つの数値を足し算する場合、次のように記述します。

int result = 10 + 5; // 10と5を加算し、resultに代入

このように、演算子を使用することで、数値の計算や条件判定などが可能になります。

演算子の基本的な構文

Javaの演算子は、変数や値を操作する際に使用されます。基本的な構文は以下のようになります。

変数 = 値1 演算子 値2;

例えば、加算演算子( +)を使う場合は、次のようになります。

int sum = 20 + 30; // 20と30を加算し、sumに代入

また、比較演算子を使用して、条件を判定することもできます。

boolean isGreater = (10 > 5); // 10が5より大きいかを判定

Javaの演算子の種類

Javaの演算子には、主に以下の種類があります。

カテゴリ演算子用途
算術演算子+ - * / %数値の計算
代入演算子= += -= *= /=変数への値の代入
比較演算子== != > < >= <=条件の比較
論理演算子&& || !条件の組み合わせ
ビット演算子& | ^ ~ << >>ビット単位の計算
インクリメント・デクリメント++ --変数の増減

これらの演算子を組み合わせることで、複雑な処理を簡潔に記述することができます。

Javaの演算子の種類

Javaの演算子は大きく6種類に分類されます。それぞれの用途を理解し、適切に使い分けましょう。

Javaの演算子の種類(6種類)

演算子の種類

  • 算術演算子(+ - * / %) … 数値の計算を行う
  • 代入演算子(= += -= *= /=) … 変数に値を代入する
  • 比較演算子(== != > < >= <=) … 条件を比較し、true / false を返す
  • 論理演算子(&& || !) … 条件を組み合わせて判定する
  • ビット演算子(& | ^ ~ << >>) … ビット単位での計算を行う
  • インクリメント・デクリメント演算子(++ --) … 変数の値を1ずつ増減する

このように、それぞれの演算子を適切に使い分けることで、効率的なプログラムを作成できます。

算術演算子(四則演算)

数値の計算に使う演算子です。

演算子意味
+加算

int a = 5 + 3;

-減算

int a = 5 - 3;

*乗算

int a = 5 * 3;

/除算

int a = 5 / 3;

%剰余

int a = 5 % 3;

この剰余算、ちょっと分かりずらいので補足します。主な使い道としては、表テーブル等の行の色を1段ごとに交互に変えたい場合などに、この剰余算を使用します。2で割ったあまりが0なら偶数、1なら奇数と言った具合です。ただ割るだけでなく、その余りを対象とします。

代入演算子

代入演算子は、変数に値を設定するための演算子です。通常の代入(=)に加えて、他の演算子と組み合わせて使用することもできます。

  • = … 右辺の値を左辺の変数に代入する
  • += … 変数の現在の値に右辺の値を加算し、結果を代入する
  • -= … 変数の現在の値から右辺の値を減算し、結果を代入する
  • *= … 変数の現在の値に右辺の値を乗算し、結果を代入する
  • /= … 変数の現在の値を右辺の値で除算し、結果を代入する
  • %= … 変数の現在の値を右辺の値で割った余りを代入する

以下のコード例では、代入演算子の基本的な使い方を示しています。

int a = 10; // aに10を代入
a += 5; // a = a + 5 と同じ(aは15になる)
a -= 3; // a = a - 3 と同じ(aは12になる)
a *= 2; // a = a * 2 と同じ(aは24になる)
a /= 4; // a = a / 4 と同じ(aは6になる)
a %= 5; // a = a % 5 と同じ(aは1になる)

代入演算子を活用することで、コードを簡潔に記述し、可読性を向上させることができます。

代入演算子の使い所

代入演算子は、プログラム内で変数の値を設定・更新する際に頻繁に使用されます。特に、計算結果の蓄積やカウンターの更新、ループ処理などで活用されます。

① 数値の初期化と更新

変数の値を設定し、その後更新する際に使用します。

int score = 100; // 初期値を設定
score += 20; // スコアを20加算(score は 120)
score -= 10; // スコアを10減算(score は 110)

② ループ処理でのカウンター管理

繰り返し処理のカウンターを更新する際に使用します。

for (int i = 0; i < 10; i += 2) { System.out.println(i); // 0, 2, 4, 6, 8 を出力 }

③ 累積計算

計算結果を変数に蓄積する際に活用します。

int total = 0; total += 50; // total に 50 を加算(total は 50) total += 30; // total に 30 を加算(total は 80)

④ 条件付きの値更新

特定の条件を満たす場合に、変数の値を変更する場面でも利用されます。

if (score >= 100) { score /= 2; // スコアが100以上なら半分にする }

このように、代入演算子はプログラムのさまざまな場面で活用され、コードの可読性と効率を向上させます。

比較演算子

条件を比較し、true または false を返します。

演算子意味
==等しい

a == b

!=等しくない

a != b

>より大きい

a > b

<より小さい

a < b

>=以上

a >= b

<=以下

a <= b

比較演算子の使い所

比較演算子は、2つの値を比較し、 true または false を返すため、条件分岐やループ処理などで頻繁に使用されます。

① 条件分岐(if文)

特定の条件を満たした場合に処理を実行する際に使用します。

int age = 20;
if (age >= 18) {
    System.out.println("成人です"); // ageが18以上なら"成人です"と表示
}

② ループ処理

条件を満たす間、処理を繰り返すために使用します。

int count = 0;
while (count < 5) {
    System.out.println("カウント: " + count);
    count++; // countが5未満の間、処理を繰り返す
}

③ 配列やリストの検索

配列やリスト内の特定の要素を検索する際に利用されます。

int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
    if (num == 3) {
        System.out.println("3が見つかりました");
    }
}

④ ユーザー入力の判定

ユーザーが入力した値を特定の条件と比較し、処理を分岐する際に使用します。

String input = "yes";
if (input.equals("yes")) {
    System.out.println("処理を続行します");
} else {
    System.out.println("処理を終了します");
}

このように、比較演算子は条件を判定し、プログラムの流れを制御する重要な役割を果たします。

論理演算子

複数の条件を組み合わせるための演算子です。

演算子意味
&&AND(かつ)

(a > 5) && (b < 10)

||OR(または)

(a > 5) || (b < 10)

!NOT(否定)

!(a > 5)

論理演算子の使い所

論理演算子は、複数の条件を組み合わせて判定するために使用されます。
特に、条件分岐やループ処理の中で使われることが多く、プログラムの制御に欠かせません。

① 複数の条件を組み合わせた条件分岐

複数の条件を同時に満たす場合に処理を実行する際に使用します。

int age = 25;
boolean hasLicense = true;
if (age >= 18   &&  hasLicense) {
    System.out.println("運転が可能です");
} else {
    System.out.println("運転できません");
}

② いずれかの条件を満たす場合の判定

いずれかの条件を満たせば処理を実行する場合に使用します。

boolean isWeekend = true;
boolean isHoliday = false;
if (isWeekend   ||  isHoliday) {
    System.out.println("今日は休みです");
} else {
    System.out.println("仕事の日です");
}

③ 否定(NOT)を使用した条件判定

特定の条件を満たさない場合に処理を実行する際に使用します。

boolean isRaining = false;
if (!isRaining) {
    System.out.println("外出できます");
} else {
    System.out.println("傘が必要です");
}

④ ループ処理での条件制御

ループの中で、複数の条件を組み合わせて処理を継続する場合に使用します。

int attempts = 0;
boolean isLoggedIn = false;
while (attempts < 3   &&  !isLoggedIn) {
    System.out.println("ログイン試行中...");
    attempts++;
    if (attempts == 2) {
        isLoggedIn = true;
    }
}

このように、論理演算子を適切に使用することで、条件分岐やループ処理をより柔軟に制御することができます。

ビット演算子

ビット単位での演算を行うための演算子です。

演算子意味
&AND

a & b

|OR

a | b

^XOR

a ^ b

~NOT

~a

<<左シフト

a << 2

>>右シフト

a >> 2

ビット演算子の使い所

ビット演算子は、整数の各ビットを直接操作するための演算子です。
主に、パフォーマンスの最適化や低レベルなデータ処理に使用されます。

① フラグ管理(ビットマスク)

複数の状態を1つの整数で管理する際に、ビット演算を使用します。

int FLAG_READ = 0b0001;   // 読み取り権限
int FLAG_WRITE = 0b0010;   // 書き込み権限
int FLAG_EXECUTE = 0b0100;   // 実行権限

int userPermission = FLAG_READ | FLAG_WRITE;   // 読み取りと書き込み権限を設定

if ((userPermission & FLAG_WRITE) != 0) {
   System.out.println("書き込み権限あり");
}

② 値の倍数・半分計算(シフト演算)

ビットシフトを利用することで、掛け算・割り算よりも高速に計算できます。

int num = 4;
int doubled = num << 1;   // 4 * 2 = 8(左シフトで倍)
int halved = num >> 1;   // 4 / 2 = 2(右シフトで半分)

③ 偶数・奇数判定(AND演算)

最下位ビット(LSB)をチェックすることで、素早く偶数・奇数を判定できます。

int number = 7;
if ((number & 1) == 0) {
   System.out.println("偶数");
} else {
   System.out.println("奇数");
}

④ ビットの反転(NOT演算)

ビット反転を使用して、数値の符号を反転できます。

int x = 5;
int y = ~x;   // 5のビットを反転(補数計算)
System.out.println(y); // -6 を出力

⑤ 2つの数値の入れ替え(XOR演算)

XOR演算を使うことで、一時変数なしで変数の入れ替えが可能です。

int a = 3, b = 7;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a = " + a + ", b = " + b); // a = 7, b = 3

このように、ビット演算子を活用することで、計算の最適化やメモリ効率の良いデータ管理が可能になります。

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

インクリメント( ++)およびデクリメント( --)演算子は、
変数の値を1ずつ増減するための演算子です。主にループ処理やカウンターの更新などで使用されます。

① インクリメント( ++)演算子

変数の値を1増やすために使用されます。

int a = 5;
a++;   // aは6になる

② デクリメント( --)演算子

変数の値を1減らすために使用されます。

int b = 10;
b--;   // bは9になる

③ 前置( ++a)と後置( a++)の違い

インクリメント・デクリメント演算子には、前置( ++a)と後置( a++)の2種類があり、
それぞれの動作が異なります。

記述方法処理のタイミング
++a(前置インクリメント)値を増やした後に処理を実行

int a = 5;
int b = ++a;   // aは6になり、bに6が代入される

a++(後置インクリメント)処理を実行した後に値を増やす

int a = 5;
int b = a++;   // bに5が代入され、その後aは6になる

--a(前置デクリメント)値を減らした後に処理を実行

int a = 5;
int b = --a;   // aは4になり、bに4が代入される

a--(後置デクリメント)処理を実行した後に値を減らす

int a = 5;
int b = a--;   // bに5が代入され、その後aは4になる

④ ループ処理での活用

ループ処理のカウンターとして利用することで、コードを簡潔に記述できます。

for (int i = 0; i < 5; i++) {
    System.out.println("カウント: " + i);
}

⑤ 条件付きカウンター更新

特定の条件を満たしたときだけカウンターを増減させる場合にも使用されます。

int score = 0;
boolean isCorrect = true;
if (isCorrect) {
    score++;   // 正解ならスコアを1増やす
} else {
    score--;   // 間違えたらスコアを1減らす
}

このように、インクリメント・デクリメント演算子を活用することで、コードの可読性と効率が向上します。

Javaの演算子の優先順位

Javaでは、演算子の優先順位が決まっており、計算の順序が制御されています。
優先順位を理解することで、意図しない計算ミスを防ぎ、正しいプログラムを書くことができます。

演算子の優先順位一覧

以下の表は、優先順位が高い順に並べたものです。数値が小さいほど優先順位が高く、先に処理されます。

優先度演算子説明
1() [] .メソッド呼び出し、配列要素アクセス、ドット演算子(オブジェクトのメンバアクセス)
2++ --前置・後置インクリメント/デクリメント
3* / %乗算、除算、剰余(左から右へ評価)
4+ -加算、減算(左から右へ評価)
5<< >>ビットシフト(左シフト、右シフト)
6<= >= > <比較演算子(大小比較)
7== !=等価・非等価の比較
8&ビットAND、論理AND(ブール値)
9^ビットXOR、論理XOR
10|ビットOR、論理OR
11&&論理AND(条件の組み合わせ)
12||論理OR(条件の組み合わせ)
13?:三項演算子(条件演算子)
14= += -= *= /=代入演算子

優先順位が影響する例

実際のコードで優先順位の影響を確認してみましょう。

① 乗算・加算の優先順位

乗算 ( *) は加算 ( +) より優先順位が高いため、以下のように計算されます。

int result = 2 + 3 * 4; // 2 + (3 * 4) → 2 + 12 → 14

意図的に加算を先に行いたい場合は、 () を使います。

int result = (2 + 3) * 4; // (2 + 3) * 4 → 5 * 4 → 20

② 比較演算子と論理演算子の優先順位

比較演算子 ( &gt;) は論理AND ( &amp;&amp;) より優先順位が高いため、以下のように評価されます。

boolean result = 5 > 3 && 10 > 8; // (5 > 3) && (10 > 8) → true && true → true

③ 代入演算子の優先順位

代入演算子 ( =) は最も優先順位が低いため、以下のように処理されます。

int a = 10;
int b = 5;
boolean result = a > b = true; // エラー(比較演算子が先に評価されるため)

代入を明示的に分けることでエラーを防ぐことができます。

boolean result = (a > b) == true; // OK

Javaの演算子の優先順位に関する注意事項

Javaの演算子には明確な**優先順位(序列)**があり、計算の順序が自動的に決まります。
この優先順位を理解することで、意図しない計算ミスやバグを防ぐことができます。

① 加算と乗算の優先順位の誤解

乗算( *)は加算( +)より優先順位が高いため、以下のように計算されます。

int result = 2 + 3 * 4;   // 2 + (3 * 4) → 2 + 12 → 14

意図的に加算を先に行いたい場合は、**括弧( ())を使う**ことが重要です。

int result = (2 + 3) * 4;   // (2 + 3) * 4 → 5 * 4 → 20

② 比較演算子と論理演算子の優先順位

比較演算子( &gt;&lt; など)は論理AND( &amp;&amp;)より優先順位が高いため、
以下のように評価されます。

boolean result = 5 > 3 && 10 > 8;   // (5 > 3) && (10 > 8) → true && true → true

③ 代入演算子の優先順位が最も低い

代入演算子( =)の優先順位は最も低いため、以下のようなコードはエラーになります。

int a = 10;
int b = 5;
boolean result = a > b = true;   // ❌ コンパイルエラー(比較演算子が先に評価されるため)

代入を明示的に分けることでエラーを防ぐことができます。

boolean result = (a > b) == true;   // ✅ 正しい書き方

④ 実は意識しなくても動くことが多い

  • 通常、 if (a &gt; b &amp;&amp; b &gt; c) のようなシンプルな条件式では、暗黙的に正しく評価される。
  • ただし、複雑な条件式や代入を含む演算をすると、バグが発生しやすい。
  • 括弧( ())を適切に使うことで、意図しない動作を防げる。

⑤ 「なぜこうなるの?」と感じたら優先順位を確認する

Javaの演算子の優先順位は、知らなくても動くことが多いですが、
思い通りに動作しない場合には、**優先順位をチェックすることで原因が分かる**ことがあります。

演算子の順序を明確にしたい場合は、常に () を使うのが安全です。

Javaの演算子の優先順位は意外と知られていない?

多くの人は ()[] が最優先であることは知っていますが、
それ以外の演算子の細かい優先順位までは意識していないことが多いです。

なぜ演算子の優先順位があまり意識されないのか?

  • 通常のコードでは if (a &gt; b &amp;&amp; b &gt; c) のように書いても直感的に動作する。
  • 括弧 () を使えば優先順位を明示できる。
  • 演算子の優先順位を完全に理解しなくても、ほとんどのコードは問題なく動く。

しかし、知らないとバグを生むケースも!

① ビット演算子と論理演算子の違い

論理演算子( &amp;&amp;||)よりも、ビット演算子( &amp;|)のほうが優先順位が低い。

boolean result = true | false && true;
System.out.println(result); // true

✅ なぜ?
&amp;&amp; のほうが優先順位が高いので、 false &amp;&amp; true が先に評価されて false に。
その後 true | false が評価され、結果は true になる。

意図的に変更する場合は () を使う。

boolean result = (true | false) && true; // false

② シフト演算子( &lt;&lt;&gt;&gt;)と算術演算子の関係

シフト演算子は +- よりも優先順位が低いため、以下のようなコードは意図しない結果になる。

int x = 2 + 3 << 1;
System.out.println(x); // 10

✅ なぜ?
+ のほうが優先順位が高いため、 2 + 3 が先に評価されて 5 になる。
その後、 5 &lt;&lt; 1(左シフト) が適用され、 10 になる。

意図的に変更する場合は () を使う。

int x = 2 + (3 << 1); // 2 + 6 = 8

③ 代入演算子( =)の優先順位が最も低い

代入演算子は == よりも優先順位が低いため、意図せず代入を行ってしまうことがある。

boolean flag = false;
if (flag = true) {
    System.out.println("実行される");
}

✅ なぜ?
本来 if (flag == true) のように比較するべきところを、誤って flag = true にしてしまうと、
flagtrue が代入されてしまい、常に if 文が実行される。

エラーを防ぐためには、正しく比較演算子を使う。

if (flag == true) { // 比較のために == を使う

または、シンプルに以下のように書くのがベスト。

if (flag) { // true なら実行

④ 実は意識しなくても動くことが多い

  • 通常、 if (a &gt; b &amp;&amp; b &gt; c) のようなシンプルな条件式では、暗黙的に正しく評価される。
  • ただし、複雑な条件式や代入を含む演算をすると、バグが発生しやすい。
  • 括弧( ())を適切に使うことで、意図しない動作を防げる。

⑤ 「なぜこうなるの?」と感じたら優先順位を確認する

Javaの演算子の優先順位は、知らなくても動くことが多いですが、
思い通りに動作しない場合には、優先順位をチェックすることで原因が分かることがあります。

演算子の順序を明確にしたい場合は、常に () を使うのが安全です。

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Javaの基礎知識(基礎編)