Java言語の算術演算子 、インクリメント演算子とデクリメント演算子 、比較演算子、論理演算子、ビット演算子 、文字列結合、優先順位について学習します。演算子とは、与えられた変数やリテラルに対して演算を行うための記号を指します。
カリキュラムのサンプル コードは、「Javaコードの実行」に示す手順で実行して確認できます。算術演算子
算術演算子は、オペランド(=数式を構成する要素のうち、演算の対象となる値)が基本データ型の場合に次の演算子を使用します。
- + : 和
- ー : 差
- * : 積
- / : 商
- % : 剰余
int i = 10 + 20 - 5; // i = 25
int i1 = 5 * 15 / 5; // i1 = 15
int i2 = 7 % 3; // i2 = 1
単独で使用する場合、符号をそのままにしておく「+」と符号を反転する「ー」があります。
整数割り算では、余りは「 0 」の方向に切り捨てられます。浮動小数計算では、無限大へのオーバーフロー(=演算結果がレジスタの表せる範囲や記憶装置上の格納域に記録できる範囲を超えてしまう現象)や、アンダーフロー(=コンピュータで実数の計算をした結果、絶対値が小さすぎて正確に表現・計算できなくなってしまうこと)となることがあります。
インクリメント演算子とデクリメント演算子
インクリメント演算子とデクリメント演算子は、数値変数か数値の配列要素にだけ適用できます。
- ++, ーー: インクリメント演算子とデクリメント演算子
int i = 10; // i = 10
i++; // i = 11
i--; // i = 10
前置と後置があり、後置の場合は元の値が使われた後に適用されます。例えば、「x++」は代入した後にインクリメントしますが、「++x」は代入する前にインクリメントします。
int x = 5;
int y;
int x1 = 5;
int y1;
y = x++; // x = 6, y = 5
y1 = ++x1; // x1 = 6, y1 = 6
比較演算子
比較演算子の結果は全てboolean値になります。NaN(=Not a Number 未定義な値か、表すことができない数値)についてのみ注意が必要になります。これらの演算子がオペランドとしてNaNになった場合、「!=」を除き全てfalseを返し、「!=」は常にtrueを返します。
- >, >=, <, <= : 大なり、以上、小なり、以下
- ==, != : 等しい、等しくない
int i = 8;
int k = 4;
System.out.println(i < k); // false
System.out.println(i <= k); // false
System.out.println(i > k); // true
System.out.println(i >= k); // true
論理演算子
複数の条件式を論理的に結合し、その結果をtrue/falseで返します。
- && : 条件積
- || : 条件和!
- ^ : 排他的論理和
- ! : 論理否定
int i = 7;
int k = 4;
int i1 = 7;
int k1 = 4;
int i2 = 7;
boolean a = true;
boolean b = false;
System.out.println(i < 0 && k > 5); // false
System.out.println(i < 5 && k > 3); // false
System.out.println(i < 9 && k > 7); // false
System.out.println(i < 9 && k > 3); // true
System.out.println(i1 < 0 || k1 > 5); // false
System.out.println(i1 < 5 || k1 > 3); // true
System.out.println(i1 < 9 || k1 > 7); // true
System.out.println(i1 < 9 || k1 > 3); // true
System.out.println(a^b); // true
System.out.println(!(i2 > 0)); // false
System.out.println(!(i2 > 9)); // true
ビット演算子
ビット操作は、オペランドは整数値 (charも含む) のみ実行できます。
- & : ビット積
- | : ビット和
- ^ : 排他的ビット和
- << : 左シフト:ビットを左にシフトさせて、右の空いたビットをゼロで埋める
- >> : 右シフト:ビットを右にシフトさせて、左の空いたビットを (シフト前の) 最上位ビットで埋める
- >>> : 右シフト(符号なし ):ビットを右にシフトさせて、右の空いたビットをゼロで埋める
ビット積は次のように計算します。
int i = 0x55 & 0x0F; // i = 5
ビット和は次のように計算します。
int i1 = 0x55 | 0x0F; // i1 = 0x5F(95)
排他的ビット和は次のように計算します。
int i2 = 0x55 ^ 0x0F; // i2 = 0x5A(90)
左シフトは次のように計算します。
int i3 = 0x15 << 2; // i3 = 0x54(84)
右シフトは次のように計算します。
int i4 = 0x15 >> 2; // i4 = 5
右シフト(符号なし )は次のように計算します。
int i5 = -92 >>> 2; // i5 = 1073741801
文字列結合
文字列を結合します。オペランドの片方が文字列であれば、文字列結合の演算子と判断され、 片方だけが文字列の場合、もう一方は暗黙的に文字列に変換されます。
- +
String a = "1234";
String b = "5678";
String c = a + b; // c = 12345678
優先順位
式の中に複数の演算子が含まれている場合、どの順序で演算するかを決めるのが優先順位です。次に優先順位の高いものからまとめます。ただし複雑な式では、塊を丸かっこで括るようにします。丸かっこで括られた部分は優先して演算されます。
- 後置演算子:[], ., (params), expr++, expr–
- 単項演算子:++expr, –expr, +expr -expr, ~, !
- 生成とキャスト:new, (type)expr
- 乗除:*, /, %
- 加減:+, –
- シフト:<<, >>, >>>
- 関係:<, >, >=, <=, instanceof
- 等値:==, !=
- 積:&
- 排他的和:|
- 和:|
- 条件積:&&
- 条件和:||
- 条件:?:
- 代入:=, +=, -=, *=, %=, >>=, <<=, >>>=, &=, ^=, |=
本節の説明は以上になります。