算術演算子
このページでは、Javaで用意されている演算子の内、+
-
*
/
%
などの算術演算子について説明を行います。演算子のページではオペランドと言う言葉を使用します。オペランドとは演算子が演算対象とするものを言います。オペランドは変数であったり、具体的な値であったり、式であったりします。
概要
算術演算子には以下の演算子が用意されています
演算子 | 記入例 | 説明 |
---|---|---|
+ | x + y | xとyを加算。 |
- | x - y | xからyを減算。 |
* | x * y | xをyで乗算。 |
/ | x / y | xをyで除算。 |
% | x % y | xをyで除算した余りを求める。 |
++ | ++x、y++ | ++xはxを1増加させた後にxを評価します。y++はyを評価した後に1増加させます。 |
-- | --x、y-- | --xはxを1減少させた後にxを評価します。y--はyを評価した後に1減少させます。 |
++、--演算子の使用
++
--
はそれぞれ対象となるオペランドを1増加ないしは1減少させます。演算子をオペランドの前に置く前置(++x、--x)と演算子をオペランドの後に置く後置(y++、y--)の方法があり、両者の意味は異なります。前置の場合は値が1増加ないしは1減少した後にその値が評価されます。後置の場合は値が評価された後に、その値が1増加ないしは1減少します。それぞれの振る舞いを以下に例示します。
【例1】++、--演算子の前置の場合と後置の場合の振る舞いの違いを例示します。
public class ExOperator1 {
public static void main(String[] args) {
int x = 10;
int y = 10;
//変数xの値を1増加させた後、変数answerXに代入を行う。
int answerX = ++x; //①
//変数yを変数answerYに代入した後、変数yの値を1増加させる。
int answerY = y++; //②
System.out.println(answerX + " : " + x); //③
System.out.println(answerY + " : " + y); //④
}
}
解説1
- (1)演算子を前置しているため、変数xの値を1増加させた後に変数answerXに値が代入されます。
- (2)演算子を後置しているため、変数yの値を変数answerYに代入した後に、変数yの値を1増加させます。
- (3)printlnメソッドでanswerXとxの値を表示します。answerXには1増加した後の値が代入されているため、11が表示されます。
- (4)printlnメソッドでanswerYとyの値を表示します。answerYには1増加する前の値が代入されているため、10が表示されます。
実行結果1
D:\JAVA>javac ExOperator1.java
D:\JAVA>java ExOperator1
11 : 11
10 : 11
D:\JAVA>
算術処理結果のデータ型
異なるデータ型間で算術演算を行う場合、結果となる変数のデータ型は計算を行ったデータ型間の関係により決まります。整数型と浮動小数点型の間で計算を行った場合、結果となるデータ型は浮動小数点型となります。データ保持量の多いデータ型(long型、double型)とデータ保持量の少ないデータ型(int型、float型)の間で計算を行った場合、結果となる変数のデータ型はデータ保持量の多いデータ型(long型、double型)となります。
また、char型、byte型、short型で計算を行った場合、結果となるデータ型はint型となります(浮動小数点型やlong型が算術処理に含まれている場合を除く)。
結果のデータ型 | 説明 |
---|---|
long |
|
int |
|
double |
|
float |
|
【例2】データ型の組み合わせによる、計算結果のデータ型の決定を例示します。
public class ExOperator2 {
public static void main(String[] args) {
int a1 = 10;
double b1 = 20.05;
int c1 = a1 + b1; //①
int a2 = 10;
long b2 = 1000;
int c2 = a2 + b2; //②
byte a3 = 10;
byte b3 = 10;
byte c3 = a3 + b3; //③
}
}
解説2
- (1)int型とdouble型の変数の計算結果をint型の変数に代入しています。浮動小数点型が含まれる計算結果のデータ型は浮動小数点型となるため、コンパイルエラーとなります。
- (2)int型とlong型の変数の計算結果をint型の変数に代入しています。データ保持容量が異なるデータ型の計算結果のデータ型はデータ保持容量が多いデータ型となるため、コンパイルエラーとなります。
- (3)byte型とbyte型の変数の計算結果をbyte型の変数に代入しています。byte型、short型の計算結果のデータ型はint型となるため、コンパイルエラーとなります。
実行結果2
D:\JAVA>javac ExOperator2.java
ExOperator2.java:5: 精度が落ちている可能性
出現: double #計算結果のデータ型がdouble型となることを表します。
要求: int
int c1 = a1 + b1;
^
ExOperator2.java:9: 精度が落ちている可能性
出現: long #計算結果のデータ型がlong型となることを表します。
要求: int
int c2 = a2 + b2;
^
ExOperator2.java:13: 精度が落ちている可能性
出現: int #計算結果のデータ型がint型となることを表します。
要求: byte
byte c3 = a3 + b3;
^
エラー 3 個
D:\JAVA>
+演算子の文字連結としての使用
+演算子は対象となるオペランドの両方が数値である場合は加算として振舞いますが、対象となるオペランドの一方でもStringオブジェクトの場合は、+はStringオブジェクトを連結するものとして振舞います。これまで何度も出てきたprintlnメソッドでこの機能は多用されています。System.out.println("答えは" + a);などです。
連結を行うオペランドの両方がStringオブジェクトであれば問題はないですが、一方がStringオブジェクトで、もう一方がStringオブジェクトでない場合はそのオペランドをStringオブジェクトに変換する必要があります。変換する方法はオペランドが参照型であるか基本型であるかによって異なります。参照型とはそれぞれのクラスから生成されたものでStringオブジェクトや各プログラマが作成する任意のオブジェクトなどがあります。基本型とはchar、byte、short、int、long、float、double、booleanのデータ形式をもったものです。
オペランドが参照型の場合はtoStringメソッドを使用します。toStringメソッドはデータをStringオブジェクトに変換するメソッドであり、クラスのルートであるjava.lang.Objectで実装されているため、すべてのクラスで使用できます。オペランドが基本型の場合はそれぞれの基本型に用意されているラッパクラス(int型がIntegerクラスなど)で実装されているtoStringメソッドを使用して、基本型のデータをStringオブジェクトに変換します。
【例3】+演算子を使用した文字連結の例です。
public class ExOperator3 {
public static void main(String[] args) {
double exOperand = 123.45; //(1)
System.out.println("答えは" + "123.45"); //(2)
System.out.println("答えは" + exOperand); //(3)
}
}
解説3
- (1)double型の変数exOperandに123.45を代入します。
- (2)オペランドの一方でもStringオブジェクトのため、+演算子を使用しオペランドの連結を行います(この場合はStringオブジェクト同士の連結)。
- (3)オペランドの一方でもStringオブジェクトのため、+演算子を使用しオペランドの連結を行います(この場合はStringオブジェクトとdouble型のデータの連結。double型のデータはdouble型のラッパクラスであるDoubleクラスのtoStringメソッドを使用してStringオブジェクトに変換され、連結されます。)。
実行結果3
D:\JAVA>javac ExOperator3.java
D:\JAVA>java ExOperator3
答えは123.45
答えは123.45
D:\JAVA>
1算術演算子