Chapter 06

Java 演算子

おでん
おでん
2021.08.14に更新

演算子

演算子は、その他プログラミング言語とほとんど同じです。

  • 算術演算子
  • 複合代入演算子
  • 比較演算子
  • 条件演算子

算術演算子

演算子 演算
+ 足し算
- 引き算
* 掛け算
/ 割り算
% 剰余(割った余り)

複合代入演算子

複合代入演算子は、演算した結果の値を代入します。

演算子 演算 通常式
+= 足し算結果の値を代入 a += 2; a = a + 2;
-= 引き算結果の値を代入 a -= 2; a = a - 2;
*= 掛け算結果の値を代入 a *= 2; a = a * 2;
/= 割り算結果の値を代入 a /= 2; a = a / 2;
%= 剰余(割った余り)結果の値を代入 a %= 2; a = a % 2;
++ インクリメント(1増加)結果の値を代入 a ++; a = a + 1;
-- デクリメント(1減少)結果の値を代入 a --; a = a - 1;

後置インクリメント/デクリメント

インクリメント/デクリメントは、配置場所が対象の値の前か後ろかによって、処理の順序が変わります。
まずは、後置の場合です。
後置の場合は、1行中に含まれる全ての処理の後に、インクリメント/デクリメントします。

int x = 2;
int y = x++;
System.out.println(x);
System.out.println(y);
結果
3
2

上記の例は、「int y = x++;」の行で、以下の処理を順番に行っています。

int y =x;
x = x + 1;

前置インクリメント/デクリメント

次は、前置の場合です。
前置の場合は、1行中に含まれる全ての処理の前に、インクリメント/デクリメントします。

int x = 2;
int y = ++x;
System.out.println(x);
System.out.println(y);
結果
3
3

上記の例は、「int y = ++x;」の行で、以下の処理を順番に行っています。

x = x + 1;
int y = x;

比較演算子

演算子 演算
> 左辺が右辺より大きい
>= 左辺が右辺以上
< 右辺が左辺より大きい
<= 右辺が左辺以上
== 右辺と左辺が等しい
!= 右辺と左辺が異なる

「=」は常に右側と覚えておきましょう。

また、「==」「!=」について注意点が1点あります。
それが、前チャプターで出てきた変数の型の基本型と参照型です。
早速、例を見ていきましょう。
まずは基本型です。

int x = 10;
int y = x;
int z = 10;
y = 5;
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(x == y);
System.out.println(x == z);

実行結果はどうなるでしょうか。

実行結果
10
5
10
false
true

流れは以下の通りです。

  • int型の変数「x」に「10」を代入します。
  • int型の変数「y」に「変数x」を代入します。
  • int型の変数「z」に「10」を代入します。
  • 変数「y」に「5」を代入します。
  • 「x」を出力します。
  • 「y」を出力します。
  • 「z」を出力します。
  • 「x」の値と「y」の値を比較し、結果を出力します。
  • 「x」の値と「z」の値を比較し、結果を出力します。

以上から、
変数「x」には「10」という値が、
変数「y」には「5」という値が、
変数「z」には「10」という値が、格納されています。

よって、「x」と「y」の値は異なるので「false」、「x」と「z」の値は等しいので「true」が返ってきます。

続いて、参照型です。

String A = new String("abc");
String B = A;
System.out.println(A);
System.out.println(B);
System.out.println(A == B);

String C = new String("abc");  
String D = new String("abc"); 
System.out.println(C);
System.out.println(D);
System.out.println(C == D);

実行結果はどうなるでしょうか。

実行結果
abc
abc
true

abc
abc
false

これは、想定外の結果だった方も多いのではないでしょうか。
流れは以下の通りです。

  • String型の変数「A」に「abc」を代入します。
  • String型の変数「B」に「変数A」を代入します。
  • 変数「A」を出力します。
  • 変数「B」を出力します。
  • 変数「A」と「B」を比較し、結果を出力します。
  • 変数「C」を出力します。
  • 変数「D」を出力します。
  • 変数「C」と「D」を比較し、結果を出力します。

以上から、
変数「A」には「abc」という参照値が、
変数「B」には「abc」という参照値が、
変数「C」には「abc」という参照値が、
変数「D」には「abc」という参照値が、格納されています。

全て、「abc」という参照値を格納しているため、比較結果は「true」になることが想定されます。
しかし、変数「C」と「D」を比較し、結果は「false」と返ってきました。
ここがキモです。
参照型は、値そのものではなく、参照値を格納しています。
つまり、「abc」という文字列ではなく。参照元を比較しているのです。
変数「B」は変数「A」と同じ参照元を参照しているのに対して、変数「C」と変数「D」は異なる参照元を参照しています。
なぜなら、それぞれ「new String()」という形で、新しいオブジェクト(つまり、参照元)を作成しているからです。
オブジェクト内の値が同じであってもそうでなくても、別のオブジェクトを参照しているということです。

ちなみに、以下の場合もまた変わります。

String s = "こんにちは";
String t = "こんにちは";
System.out.println(s == t);
実行結果
true

この場合は、既にある「こんにちは」という文字列を参照するオブジェクトを自動的に再利用しています。
混乱しやすいところですが、「new」があるかないかで判断するのが分かりやすいと思います。
※参照型に関しては別チャプターで改めて詳しく解説します

条件演算子

複数条件式での演算で使用します。

演算子 演算
&& かつ

| || | もしくは |

 int a = 1;
 int b = 1;
 int c = 2;
 if (a == b) {
   System.out.println("aとbは等しい");
 }
 if ((a == b) && (a == c)) {
   System.out.println("aとbは等しい、かつ、aとcは等しい");
 }
 if ((a == b) || (a == c)) {
   System.out.println("aとbは等しい、または、aとcは等しい");
 }
実行結果
aとbは等しい
aとbは等しい、または、aとcは等しい