演算子
プログラム内での計算させるための記号を「演算子」といいます。
「演算子」には、「算術演算子」「シフト演算子」などさまざまな「演算子」があります。
これらの「演算子」には優先順位があるので覚えておくといいと思います。
算術演算子
算術演算子は、2つの構成になります。
加法演算子と、乗法演算子に別けられます。乗法演算子の方が優先順位が高く、先に計算されます。
加法演算子
|
足し算
|
+
|
引き算
|
-
|
乗法演算子
|
掛算
|
*
|
割り算
|
/
|
余り
|
%
|
----------------- Main.java --------------------------
class Main {
public static void main(String[] args) {
int j;
int x;
int y;
int z;
i = 2;
j = 3;
x = 3;
y = 3;
z = x + y;
System.out.println(" i = " + i);
System.out.println(" j = " + j);
System.out.println(" x = " + x);
System.out.println(" y = " + y);
System.out.println("x + y = " + z);
z = x * y;
System.out.println("x * y = " + z);
z = x / y;
System.out.println("x / y = " + z);
z = x * y + j;
System.out.println("x * y + j = " + z);
z = x * (y + j);
System.out.println("x * (y + j) = " + z);
z = j % i;
System.out.println("j % i = " + z);
}
}
--------実行結果-------------
i = 2
j = 3
x = 3
y = 3
x + y = 6
x * y = 9
x / y = 1
x * y + j = 12
x * (y + j) = 18
j % i = 1
x * y + j = 12
x * (y + j) = 18
結果の違いがわかります、()をつけなかった場合と、()をつけた場合とでは、計算される順序が違うために結果が異なります。
j % i = 1 は、3 / 2 = 1 ...1 のあまりの部分...1 を返します。
%は使うと結構便利です。
%は、モジェロ演算子というそうです。
偶数か、奇数かを判断する場合などで、ある数を2で割った余りが0か1かで判断するときなどによく利用します。
オーバーフロー(桁あふれ)
ここで簡単なプログラムを書いてみましょう。
---------------- Main01.java --------------------------------
class Main01 {
public static void main(String[] args) {
int x;
int y;
int z;
x = 100000;
y = 100000;
System.out.println("x = " + x);
System.out.println("y = " + y);
z = x + y;
System.out.println("x + y = " + z);
z = x * y;
System.out.println("x * y = " + z);
}
}
----------------実行結果-----------------------
x = 100000
y = 100000
x + y = 200000
x * y = 1410065408
x * y = 1410065408 計算結果がおかしくなっています
なぜこのようなことがおきたのでしょうか?
Javaの変数を理解するで、変数の「型」の話をしました。
ここで使用している「型」は intで、 メモリ領域の確保は4byte、 表現できる数値の範囲は、-2147483648〜+2147483647
の間になります。 つまり、int「型」では、表現できる数値、詳しくいえば、計算結果が確保している領域からはみだしてしまい、表現できなくなってしまったのです。
int 「型」は、4 Btye の領域
1Byte = 8bit 8 * 4 = 32bit まで表現できます。
32bit中の先頭の1bitは(+ −)の表現で使用されますので 31bit分が数値の範囲となります。
2の31乗 -2147483648〜+2147483647の範囲をこえてしまったためだと考えられます。
そこで、int「型」ではなく、longの「型」に変えて実行してみましょう。
------------Main2.java----------------------------
class Main02 {
public static void main(String[] args) {
long x;
long y;
long z;
x = 100000;
y = 100000;
System.out.prlongln("x = " + x);
System.out.prlongln("y = " + y);
z = x + y;
System.out.println("x + y = " + z);
z = x * y;
System.out.println("x * y = " + z);
}
}
-----------実行結果-----------------------------
x = 100000
y = 100000
x + y = 200000
x * y = 10000000000
今度は、ちゃんと表示できました。
すこし演算子とは話がずれてしまいましたが、次に進みましょう。
インクリメント・デクリメント
演算子 |
説明 |
a++; |
変数aの値を1増やします。 |
a = a + 1; |
変数aの値を1増やします |
a--; |
変数aの値を1減らします。 |
a = a - 1; |
変数aの値を1減らします。 |
インクリメント・デクリメント演算子は、変数の値を1増やします(減らします)。
インクリメント・デクリメントの前置、後置
インクリメント・デクリメント演算子は、変数に対して前にも、後ろにも記述することができます。
変数に対して、1増やしたり、減らしたりする目的なら同じ記述でもいいのですが、実行結果が異なります。
---------------Increment.java------------------
class Increment {
public static void main(String[] args) {
int a = 0;
int b = 0;
for(int i = 0; i < 9; i++) {
System.out.println(i + "回目のa = " + a);
System.out.println(i + "回目のb = " + b);
a = a++;
b = ++b;
}
}
}
----------------実行結果---------------------
0回目のa = 0
0回目のb = 0
1回目のa = 0
1回目のb = 1
2回目のa = 0
2回目のb = 2
3回目のa = 0
3回目のb = 3
4回目のa = 0
4回目のb = 4
5回目のa = 0
5回目のb = 5
6回目のa = 0
6回目のb = 6
7回目のa = 0
7回目のb = 7
8回目のa = 0
8回目のb = 8
違いがわかりましたか? つまり、 a++; 後置の場合は、代入してから1増やします。
b++; 前置の場合は、代入する前に1増やします。
実際にプログラムのコーディングをする場合は、どちらか一方を使用すると決めてから使用したほうがいいでしょう。
比較演算子
変数または、リレラルを比較してboolean型(ture、false)を返します。
演算子
|
説明
|
== |
演算子の左と右を比較して等しいとtrueを返します。 等しくないとfalseです。 =が1個だと代入ですが、=が2個だと
比較演算子になります。 |
!= |
演算子の左と右を比較して等しいとfalseを返します。 等しくないとtrueです。 |
< |
演算子の左と右を比較して左側が右側より小さいとtrueを返します。 |
> |
演算子の左と右を比較して左側が右側より大きいとtrueを返します。 |
<= |
演算子の左と右を比較して左側が右側より小さいか、等しいとtrueを返します |
>= |
演算子の左と右を比較して左側が右側より大きいか、等しいとtrueを返します。 |
----------------Compare.java--------------------------
class Compare {
public static void main(String args[]){
int x = 1;
int y = 2;
boolean comp01;
System.out.println("----- Start ----------");
System.out.println("x = " + x);
System.out.println("y = " + y);
comp01 = x < y;
System.out.println("x < y = " + comp01);
comp01 = x > y;
System.out.println("x > y = " + comp01);
comp01 = x <= y;
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("x <= y = " + comp01);
x = y;
comp01 = x <= y;
System.out.println("ここでxにyを代入します。");
System.out.println("x = y ");
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("x <= y = " + comp01);
x = 3;
comp01 = x <= y;
System.out.println("ここでxに3を代入します。");
System.out.println("x = 3 ");
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("x <= y = " + comp01);
System.out.println("");
System.out.println("---------End--------------");
}
}
--------------実行結果------------------------
----- Start ----------
x = 1
y = 2
x < y = true
x > y = false
x = 1
y = 2
x <= y = true
ここでxにyを代入します。
x = y
x = 2
y = 2
x <= y = true
ここでxに3を代入します。
x = 3
x = 3
y = 2
x <= y = false
---------End--------------
true と falseがちゃんと入れ替わっているのがわかります。
いろいろと試してみてください。
比較演算子は、forループや、if文などでよく使いますのでちゃんと覚えておいて下さい。
演算子の優先順位
優先順位 |
演算子 |
高
↑
↓
低 |
[] () |
++ -- |
! ~ instanceof |
* / % |
+ - |
<< >> >>> |
< > <= == != |
& ^ | >= |
&& || |
?: |
= op=(*= /= %= += -= |
|