演算とは

変数を作成してプログラムでデータ加工や計算をすることを演算といいます。どのような演算をするかを決めるための記号を演算子といい、データ型に応じて違います。また演算子でない方を 被演算子(オペランド) といいます。

数値の演算

「1」「2」がオペランド、「+」が演算子です。

1 + 2;

演算子

演算子の種類は「 + 」「 - 」「 * 」「 / 」「 % 」があります。

演算子 処理 演算 結果
+ たし算 3 + 2 5
- ひき算 3 - 2 1
* かけ算 3 * 2 6
/ わり算 3 / 2 1.5
% 余り 3 % 2 1

二項演算

二項演算は四則演算(加減乗除)などで2つの値から新たな値を作成することをいいます。 プログラムでは変数や値が 2つ登場する演算のことをいいます。

ファイル構成

sampleパッケージに ItemCalculateクラスを作成してプログラムを作成しましょう。

src/
  └── sample/
     └── ItemCalculate.java
sample/ItemCalculate.java
package sample;

public class ItemCalculate {
    
    public static void main(String[] args) {
        
    }
}

数値の二項演算

変数answerint型で定義して 1 + 2 を代入します。

int answer = 1 + 2;

プログラムは右辺から処理する

プログラムの演算式で左辺と右辺がどちらから処理されるか疑問に思うかもかも知れません。プログラム処理は右辺から処理するルールになっています。

変数を再代入

まず、右辺の answer + 3 を処理してから、左辺の answer に再代入します。

answer = answer + 3;

四則演算

変数を四則演算で計算して、結果を確認してみましょう。

sample/ItemCalculate.java
int answer = 1 + 2;
answer = answer + 3;
answer = answer - 2;
answer = answer * 5;
answer = answer / 2;

System.out.println("答えは" + answer);
		
int mod = answer % 3;
System.out.println("余りは" + mod);
結果
答えは10
余りは1

キャスト(Cast)

キャストとは

通常、データ型の違う値を演算子しようとするとエラーで計算できません。そこで、データ型の違う値の、データ型を変換することをキャストといいます。

キャストの方法

変数の前に(データ型)を指定すると、キャストできます。

(データ型) 変数

コンパイルエラー

pricepointRateの計算の結果(float)を、point (int)に代入すると、コンパイルエラーになります。

sample/ItemCalculate.java
int price = 200;
float pointRate = 0.05f;
//int にキャストして point に代入
int point = price * pointRate)
System.out.println(point + "pt");

キャストして代入

pointに結果を代入するには、int型にキャストしてから代入します。

sample/ItemCalculate.java
int price = 200;
float pointRate = 0.05f;
//int にキャストして point に代入
int point = (int) (price * pointRate);
System.out.println(point + "pt");
結果
10pt

自動キャスト

自動キャストとは

通常は異なるデータ型は計算できませんが、Javaではデータ型によって自動的にデータ型を変換する、自動キャスト機能があります。 pricepointRateはデータ型が違いますが、自動キャストで計算されます。

sample/ItemCalculate.java
int point = (int) (price * pointRate);

String型とint型の演算

通常は String型とint型は演算できませんが、特例として + で連結でき、これを自動キャストといいます。

sample/ItemCalculate.java
String itemName = "コーヒー";
String message = itemName + "の価格は" + price + "円です。";
System.out.println(message);
結果
コーヒーの価格は150円です。

単項演算

単項演算は1つの変数に対して演算処理し、その結果を変数に再代入します。

演算子 読み方 処理 演算
++ インクリメント 変数を1増加 a++ a = a + 1
-- デクリメント 変数を1減少 a-- a = a - 1

単項演算の例

int amount = 5;
// amount に 1 足した結果を amount に代入
amount++;
System.out.println(amount);

// amount から 1 引いた結果を amount に代入
amount--;
System.out.println(amount);
結果
6
5

単項演算子を前につける

単項演算子は変数の前につけることもできます。その場合、値を最初に演算してから処理されます。

amount = 10;
//11 + 10
System.out.println(amount++ + amount++);

この計算は「(10 + 1) + 10」となり2番目の amount++ が演算される前に足し算されます。

結果
21

この計算は「(10 + 1) + (11 + 1)」となり1、2番目の ++amount が演算されて足し算します。

amount = 10;
//11 + 12
System.out.println(++amount + ++amount);
結果
23

複合演算

複合演算は、二項演算の計算を省略して書くことができます。= の前に演算子を記述して値を代入します。

演算子 読み方 処理
+= たし算 変数に2を足す a += 2 a = a + 2
-= ひき算 変数に2を引く a -= 2 a = a - 2
*= かけ算 変数に2をかける a *= 2 a = a * 2
/= わり算 変数を2で割る a /= 2 a = a / 2
price = 110;
amount = 3;
//price から10ひく
price -= 10;
//price に amount をかける
price *= amount;
System.out.println(price);
結果
300

文字列の複合演算

文字列でも複合演算 += で連結できます。

message = itemName + "の価格は" + price + "円です。";
message += "購入しますか?";
System.out.println(message);
結果
コーヒーの価格は300円です。購入しますか?

その他のエラー

オーバーフロー

演算処理でint型の範囲外になると、正しくない値になります。これをオーバーフローといいます。値が間違っていても、プログラム自体は処理されるので注意が必要です。

price = 100000;
amount = 100000;
int total_price = price * amount;
System.out.println(total_price);
結果

計算結果が間違っています。

1410065408

キャストで計算

オーバーフローを回避するには、int型より大きな整数を扱える long型でキャストするか、そもそもの変数宣言を long型にします。

price = 100;
amount = 0;
//long型にキャスト
long total_price = (long) price * (long) amount;
System.out.println(total_price);
結果

正しく計算できました。

10000000000

ランタイムエラー

数値を0で割るとコンパイルエラーにはなりません。

コンパイル成功

price = 100;
amount = 0;
float average = price / amount;
System.out.println(average);

ランタイムエラーが発生

プログラム実行すると、ランタイムエラーになります。今回の場合は、0で割り算しないようにプログラム制御する必要があります。

演習

問題1

hpがいくつになるか確認してみましょう。

int hp = 5;
hp++;
hp -= 4;
hp *= 4;
hp /= 2;

問題2

以下の変数を使って「○○の年齢は○○歳です。」とコンソール表示してみましょう。

String user_name;
int age;

問題3

・ミネラルウォーター:88円 x 5個

・コーヒー:120円 x 3個

・割引:10%

の合計金額を計算してみましょう。

問題4

Scannerクラスの標準入力を利用して、「国語」「数学」「理科」「社会」を変数に代入し、全体の平均点計算してみましょう。標準入力のメッセージは以下のようにします。

国語の点数を入力してください。
(キーボードで数値を入力)
数学の点数を入力してください。
(キーボードで数値を入力)
理科の点数を入力してください。
(キーボードで数値を入力)
社会の点数を入力してください。
(キーボードで数値を入力)