1概要

このチュートリアルでは、Javaの複合演算子、それらの型、およびJavaがそれらをどのように評価するかについて説明します。

暗黙的キャストがどのように機能するかについても説明します。


2複合代入演算子

代入演算子は、右側の結果を左側の変数に代入する二項演算子です。最も簡単なのは、

“ =”

代入演算子です。

int x = 5;

このステートメントは、新しい変数

x

を宣言し、

x



5

の値を代入して

5

を返します。

複合代入演算子は、算術演算またはビット単位演算を適用し、その演算の値を左側の変数に代入するための短い方法です。

たとえば、次の2つの乗算ステートメントは同等で、

a



b

は同じ値になります。

int a = 3, b = 3, c = -2;
a = a **  c;//Simple assignment operator
b ** = c;//Compound assignment operator

複合代入演算子の左側にある変数はすでに宣言されている必要があることに注意することが重要です。つまり、** 複合演算子を使って新しい変数を宣言することはできません。

“ =”代入演算子と同様に、複合演算子は式の代入結果を返します。

long x = 1;
long y = (x+=2);


x



y

の両方が値

3

を保持します。

代入

(x = 2)

は、2つのことを行います:最初に、変数

x

の値に2を加えて

3とし、次に、代入の値を返します(これも

3__です)。


3複合代入演算子の種類

Javaは11個の複合代入演算子をサポートしています。これらを算術演算子とビット演算子にまとめることができます。

算術演算子とそれらが実行する演算を見てみましょう。

  • インクリメント:

    + =

  • デクレメント:

    – =

  • 掛け算:

    ** =

  • 部署:

    /=

  • モジュラス:

    %=

それから、ビット演算子もあります。

  • AND、バイナリー:

    &=

  • 排他的論理和、バイナリ:

    ^ =

  • 排他的論理和、バイナリ:

    | =

  • 左シフト、バイナリ:

    << =

  • 右シフト、バイナリ:

    >> =

  • 右詰めゼロをシフト:

    >>> =

これらの操作のいくつかの例を見てみましょう。

----//Simple assignment
int x = 5;//x is 5
//Incrementation
x += 5;//x is 10
//Decrementation
x -= 2;//x is 8
//Multiplication
x ** = 2;//x is 16
//Modulus
x %= 3;//x is 1
//Binary AND
x &= 4;//x is 0
//Binary exclusive OR
x ^= 4;//x is 4
//Binary inclusive OR
x |= 8;//x is 12
----

ここでわかるように、これらの演算子を使用するための構文は一貫しています。

** 4複合代入演算の評価

Javaが複合操作を評価する方法は2つあります。

まず、

左側のオペランドが配列ではない場合、

Javaは以下の順序で行います。

  1. オペランドが宣言済み変数であることを確認してください

  2. 左側のオペランドの値を保存します

  3. 右側のオペランドを評価する

  4. 複合演算子で示されるように二項演算を実行する

  5. 二項演算の結果を次の型に変換します.

左側の変数(暗黙的キャスト)
。変換結果を左側の変数に代入します

次に、** 左側のオペランドが配列の場合、以下のステップは少し異なります。

  1. 左側の配列式を確認して、

ある場合は

NullPointerException

または

ArrayIndexOutOfBoundsException

間違っている
。配列要素をインデックスに保存する

  1. 右側のオペランドを評価する

  2. 選択された配列要素がプリミティブ型か参照かを確認する

左のオペランドが変数であるかのように、最初のリストと同じ手順を入力して続行します。

評価のいずれかの手順が失敗した場合、Javaは次の手順を実行し続けません。

  • 配列要素に対するこれらの演算の評価に関連するいくつかの例を挙げましょう:**

int[]numbers = null;
//Trying Incrementation
numbers[2]+= 5;

予想通り、これは

NullPointerException

をスローします。

しかし、配列に初期値を代入すると:

int[]numbers = {0, 1};
//Trying Incrementation
numbers[2]+= 5;

__NullPointerExceptionは取り除かれるでしょう。

これを修正すれば、操作は正常に完了します。

int[]numbers = {0, 1};
//Incrementation
numbers[1]+= 5;//x is now 6

最後に、

x

変数は代入の終わりには

6

になります。


5暗黙的キャスト

複合演算子が有用な理由の1つは、それらが演算のためのより短い方法を提供するだけでなく、暗黙的に変数をキャストすることです。

形式的には、次の形式の複合代入式です。


E1 op = E2

以下と同等です。


E1 – (T)(E1とE2)

ここで、

T



E1

の型です。

次の例を考えましょう。

long number = 10;
int i = number;
i = i **  number;//Does not compile

最後の行がコンパイルされない理由を見てみましょう。

Javaは、1つの操作で一緒になっているときに、小さいデータ型を大きいデータ型に自動的にプロモートしますが、

大きいタイプから小さいタイプに変換しようとするとエラーが発生します

したがって、最初に

i



long

に昇格され、次に乗算によって

10Lが返されます。長い結果は

i

に割り当てられます。これは

int__であり、これはエラーをスローします。

これは明示的なキャストで修正できます。

i = (int) i **  number;

Java複合代入演算子は、暗黙のキャストを行うので、この場合は完璧です。

i ** = number;

このステートメントはうまく機能し、乗算結果を

int

にキャストし、その値を左側の変数

i

に代入します。


6. 結論

この記事では、Javaの複合演算子について検討し、いくつかの例とそれらの異なるタイプを示しました。 Javaがこれらの操作をどのように評価するかを説明しました。

最後に、これらの短縮形演算子が有用な理由の1つである暗黙的キャストも検討しました。

いつものように、この記事で言及されているすべてのコードスニペットは私たちのhttps://github.com/eugenp/tutorials/tree/master/core-java-lang[GitHub repository]にあります。