Java における演算子の概要
Java プログラミング環境では、データ間の処理を定義するためにいくつかのカテゴリに分類された演算子が提供されています。主な分類として、算術演算、比較関係演算、ビット単位での操作、論理演算、値の代入、および条件付き演算などが挙げられます。以下で各演算子の特性と使用例を解説します。
1. 算術演算子について
数値計算を行うための基本的な演算子です。整数と浮動小数点数における挙動の違いに注意が必要です。変数 leftVal に 10、rightVal に 5 を設定した場合の動作は以下の通りです。
| 記号 | 意味 | サンプル結果 |
|---|---|---|
| + | 加算 | leftVal + rightVal = 15 |
| - | 減算 | leftVal - rightVal = 5 |
| * | 乗算 | leftVal * rightVal = 50 |
| / | 除算(整数同士の割算是切り捨て) | leftVal / rightVal = 2 |
| % | 剰余算 | leftVal % rightVal = 0 |
| ++ | インクリメント(値を 1 増やす) | 左値または右値によりタイミングが異なる |
| -- | デクリメント(値を 1 減らす) | 同上 |
public static void demonstrateArithmetic() {
int x = 10, y = 5, z = 3;
// 基本演算の確認
System.out.println("加法結果: " + (x + y));
System.out.println("減法結果: " + (x - y));
System.out.println("乘法結果: " + (x * y));
// 整数割り算は小数点を切り捨てる
System.out.println("整数除法: " + (x / z)); // 3
// 浮動小数点混在時の精度問題
float numFloat = 10.5F;
System.out.println("浮動小数点除法: " + (numFloat / y));
// インクリメントの順序差
int preInc = 10;
int postInc = 10;
System.out.println("後置++使用前値: " + (postInc++)); // 出力は 10、変数は 11
System.out.println("前置++使用時値: " + (++preInc)); // 出力は 11、変数は 11
}
特に前置形式(++a)と后置形式(a++)では、式の評価が行われるタイミングが増減処理と異なる点に留意してください。
2. 関係演算子(比較演算)
二つの値の大小や等価性を判定し、ブール型(true/false)の結果を返します。オブジェクト間での比較を行う場合は、参照比較になるため注意が必要です。
| 記号 | 説明 | 判定結果 |
|---|---|---|
| > | 左の方が大きいか | true または false |
| < | 左の方が小さいか | true または false |
| >= | 以上(含む) | true または false |
| <= | 以下(含む) | true または false |
| == | 等価チェック | true または false |
| != | 不等価チェック | true または false |
public static void demonstrateComparison() {
int valA = 10;
int valB = 5;
System.out.println("大なり判定:" + (valA > valB));
System.out.println("小なり判定:" + (valA < valB));
System.out.println("等価性:" + (valA == valB));
// 数値型以外の場合は equals メソッド等の確認が必要
}
3. ビット演算子
数値をバイナリ(2 進数)表現として扱い、ビット単位での処理を行います。整数型のデータ(int, long, byte など)に対して適用可能です。
| 演算子 | 名称 | 動作説明 |
|---|---|---|
| & | AND(論理積) | 両方が 1 の場合にのみ 1 |
| | | OR(論理和) | いずれかが 1 であれば 1 |
| ^ | XOR(排他的論理和) | 値が異なれば 1 |
| ~ | NOT(反転) | 全てのビットを 0/1 反転 |
| << | 左シフト | ビットを左へ移動 |
| >> | 符号あり右シフト | 空いた高位を符号と同じ値で埋める |
| >>> | 符号なし右シフト | 空いた高位を常に 0 で埋める |
public static void demonstrateBitwise() {
int binaryA = 50; // 0011 0010
int binaryB = 15; // 0000 1111
int shiftCount = 3;
System.out.println("AND 演算: " + (binaryA & binaryB));
System.out.println("OR 演算: " + (binaryA | binaryB));
System.out.println("NOT 演算: " + (~binaryB)); // 負数の表現に注意
// シフト操作
System.out.println("左シフト結果: " + (binaryA << shiftCount));
System.out.println("符号あり右シフト: " + (binaryA >> shiftCount));
// 負数の場合、>>> と >> の結果が異なります
}
4. 論理演算子
真偽値を用いて条件を組み立てます。短絡評価(ショートサーキット)の特性を持つものが含まれます。
| 演算子 | 動作 | 条件成立時 |
|---|---|---|
| && | AND | 両側が true なら true |
| || | OR | 片方でも true なら true |
| ! | NOT | 真偽値を反転 |
論理 AND(&&) および OR(||) は、左側の演算だけで結果が確定する場合、右側の式の評価を行わない「短縮」機能を備えています。
public static void demonstrateShortCircuit() {
int counter = 10;
boolean conditionA = (counter > 5); // true
// 左が true なので右が評価される
boolean flag = (conditionA && (++counter > 10));
// counter は増加する可能性あり
int another = 3;
// 左が false なので右は実行されない(短絡)
boolean safeFlag = (another > 5 && (++another > 5));
// another は変化しない
}
5. 代入演算子
単なる代入(=)に加え、四則演算やビット演算を結合した簡易的な代入方法を提供します。
| 構文 | 等価な書き換え |
|---|---|
| a += b | a = a + b |
| a -= b | a = a - b |
| a *= b | a = a * b |
| a /= b | a = a / b |
| a %= b | a = a % b |
| a &= b | a = a & b |
6. 条件演算子(三項演算子)
if-else 構文を一行にまとめることができる簡潔な表記です。形式は「条件式 ? 真の場合の値 : 偽の場合の値」となります。
public static void demonstrateTernary() {
int score = 85;
int limit = 60;
// 合格フラグの決定
String result = (score > limit) ? "合格" : "不合格";
// 最大値の取得
int maxVal = (10 > 20) ? 10 : 20;
System.out.println("判定結果: " + result);
System.out.println("最大値: " + maxVal);
}