演算とは

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

数値の演算

「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) {
        
    }
}

数値の二項演算

変数「answer」をint型で定義して「1 + 2」を代入します。

int answer = 1 + 2;

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

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

変数を再代入

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

answer = answer + 3;

四則演算

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

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)

キャストとは

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

キャストの方法

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

(データ型) 変数

キャストの例

int型とfloat型の値をキャストして計算をしてみましょう。

int price = 200;
float pointRate = 0.05f;
//price を float にキャスト
float point = (float) price * pointRate;
//point を int にキャスト
System.out.println((int) point + "pt");
結果
10pt

String型とint型の演算

文字列型の変数は「 + 」で連結します。

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++」が演算される前に足し算されます。 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

「国語」「数学」「理科」「社会」の平均点を、変数使って計算してみましょう。

  • 国語:76点
  • 数学:83点
  • 理科:69点
  • 社会:91点