こんにちは、現役SEの「とも」です。
今回は、算術演算子について見ていきましょう。
算術演算子は、主に数値を計算をするために用いられます。
+だけは、文字列に使用した場合に文字列の結合という意味合いで使用することができます。
整数型と浮動小数点型で使える算術演算子
以下に、整数型と浮動小数点型で使用できる算術演算子の種類を記載します。
【整数型と浮動小数点型で使用できる算術演算子】
記載 | 例 | 説明 |
---|---|---|
+ | A + B | AにBを足した結果を返します。算数の足し算と同じ意味合いです。 |
– | A + B | AからBを引いた結果を返します。算数の引き算と同じ意味合いです。 |
* | A * B | AにBを掛けた結果を返します。算数の掛け算と同じ意味合いです。 |
/ | A / B | AをBで割った結果を返します。算数の割り算と同じ意味合いです。 |
% | A % B | AをBで割った余りを返します。算数の割り算の結果で出た「余り」と同じ意味合いです。 |
【整数型】の「+」「-」「*」「/」「%」演算子の記載方法
int a = 2 + 1; //結果は3
int b = 2 - 1; //結果は1
int c = 2 * 3; //結果は6
int d = 4 / 2; //結果は2
int e = 3 % 2; //結果は1(3を2で割った余り)
整数型で割り算を行うときの注意点
整数型で割り算を行った場合、余り部分は強制的に切り捨てられます。
int a = 5 / 2; //結果は2
- 四捨五入したい場合は、double型やBigDecimal型に変換して、四捨五入するためのメソッドを使用するのが一般的です。
- ※BigDecimal型は別の記事で書きます。
【浮動小数点型】の「+」「-」「*」「/」「%」演算子の記載方法
double a = 2.3 + 1.1; //結果は3.4
double b = 2.3 - 1.1; //結果は1.1999999999999997
double c = 2.5 * 3.0; //結果は7.5
double d = 5.0 / 2.0; //結果は2.5
double e = 3.5 % 2.0; //結果は1.5(3.5を2.0で割った余り)
「b = 2.3 – 1.1」の結果が、「1.1999999999999997」となっていますが、このように浮動小数点型では2進数で表現できない数値の場合、結果に誤差が生じます。
誤差については、下のリンクに浮動小数点型の説明がありますので、こちらを参照ください。
型の違うデータどうしの計算について
型が違うデータどうしの計算をした場合、優先度の低い型が優先度の高い型に変換(キャスト)されて計算されます。
【データ型の優先順位】
優先度 | データ型 |
---|---|
高い | double |
↑ | float |
↑ | long |
↑ | int |
↑ | short |
低い | byte |
例)
long a = 123_456_789_123_456L;
float b = 2.0f;
System.out.println( a + b);
実行結果)float型で計算される
1.2345679E14
0で割ったときの挙動について
「/」や「%」で分母を0にした場合の挙動は整数型と浮動小数点型で異なり、以下の通りになります
【整数型で0で割った場合】
System.out.println( 100 / 0);
実行結果)実行時に「java.lang.ArithmeticException」が発生する
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.example.demo.DemoApplication.main(DemoApplication.java:12)
【整数型で0で割った余りを計算した場合】
System.out.println( 100 % 0);
実行結果)実行時に「java.lang.ArithmeticException」が発生する(割り算と同じ)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.example.demo.DemoApplication.main(DemoApplication.java:12)
【浮動小数点型で0.0で割った場合】
System.out.println( 100.0 / 0.0);
実行結果)無限大を示す「infinity」となる(エラーにはならない)
Infinity
【浮動小数点型で0.0で割った余りを計算した場合】
System.out.println( 100.0 % 0.0);
実行結果)無効な演算結果を示す「NaN」となる(エラーにはならない)
NaN
【浮動小数点型で0.0を0.0で割ったり、余りを求めた場合】
System.out.println( 0.0 / 0.0);
System.out.println( 0.0 % 0.0);
実行結果)無効な演算結果を示す「NaN」となる(エラーにはならない)
NaN
NaN
整数型のみで使える算術演算子
記載 | 例 | 説明 |
---|---|---|
++ | ++A A++ |
Aに1足した結果を返します。(++の記載する位置によって、計算するタイミングが変わります) |
-- | --A A-- |
Aから1引いた足した結果を返します。(--の記載する位置によって、計算するタイミングが変わります) |
++(インクリメント)、--(デクリメント)の記載方法
++をインクリメント、--をデクリメントと言います。
- インクリメントは、変数の値を+1し、
- デクリメントは、変数の値を-1します。
インクリメントとデクリメントは、変数の前に記載するか、変数の後に記載するかで実行されるタイミングが変わります。
記載例)
int a = 0;
int b = 0;
System.out.println( ++a);
System.out.println( b++);
System.out.println( b);
実行結果)
1 ← System.out.println( ++a);の結果
0 ← System.out.println( b++);の結果
1 ← System.out.println( b);の結果
「++a」の結果は、関数(System.out.println)が実行される前にインクリメントされるのに対し、「b++」の結果は、実行された後にインクリメントされていることが分かります。
- 「++a」を「前置」
- 「a++」を「後置」
といいます。
デクリメントも同様の動きとなります。
記載例)
int a = 0;
int b = 0;
System.out.println( --a);
System.out.println( b--);
System.out.println( b);
実行結果)
-1 ← System.out.println( --a);の結果
0 ← System.out.println( b--);の結果
-1 ← System.out.println( b);の結果
通常は直感的に分かる、前置の「++a」がよく使われますが、処理の後にインクリメントやデクリメントしたい場合には後置が使われます。
「後置」は主に、for文のループ処理で「慣用句」のように使われることが多いですが、実際に意味のある使われ方をしていることは少ないです。
for文については別の記事で触れますが、実際には「i++」で書かれている場所は、ループ処理の最後で実行されるため、後置で書かれている必要はありません。
for( int i = 0; i < 3; i++){
System.out.println( i);
}
実行結果)
0
1
2
前置でも同じ結果
for( int i = 0; i < 3; ++i){
System.out.println( i);
}
実行結果)
0
1
2
意味のある使われ方としては、下のような使い方ですね。
i++はwhileの条件判定の後に加算されるので、3回ループされます。
int i = 0;
while( 3 > i++){
System.out.println( i);
}
実行結果)
1
2
3
前置の場合、インクリメントした後に条件判定されるので、2回ループになります。
int i = 0;
while( 3 > ++i){
System.out.println( i);
}
実行結果)
1
2
ですが、実際にはこのような書かれ方は分かりづらく、バグの温床になってしまうので通常は下のように書かれることが多いです。
int i = 0;
while( 3 > i){
++i;
System.out.println( i);
}
実行結果)
1
2
3
ループの最後で加算したい場合は、下のように書きます。
int i = 0;
while( 3 > i){
System.out.println( i);
++i;
}
実行結果)
0
1
2
文字列に使える算術演算子
以下に、文字列で使用できる算術演算子の種類を記載します。
記載 | 例 | 説明 |
---|---|---|
+ | A + B | AとBの文字列を結合します。 |
文字列の結合は頻繁に使用される書き方です。
記載例)
String str1 = "あいう";
String str = str1 + "えお";
System.out.println( str);
実行結果)
あいうえお
以上が、算術演算子の説明でした。