第3章 演算子

はじめに

数学で計算式を書く時、+、-、×、÷という記号を使いますが、Java言語でも計算式を書くために同じような記号を使いますが、Java言語ではもっとたくさんの計算するための記号があります。計算で使用する記号のことを演算子といいます。この章では、演算子の種類や使い方について学習します。

目次

  • 基本的な演算子
  • 単項演算子
  • 文字列の連結
  • 算術演算子
  • 代入演算子
  • 複合代入演算子
  • 関係演算子
  • 論理演算子
  • 優先順位と結合規則
  • 章のまとめ

目標

演算子の種類と性質を理解し、各演算子を使用した処理ができるようにすること。

基本的な演算子

プログラムでは、変数に値を代入するだけではなく、変数や定数に対して加算や比較などの演算を行うことがあります。計算式の中では + 記号や > 記号を使用して加算や比較という個々の演算をします。
計算や比較をするための記号のことを演算子と呼びます。

[Java言語の演算子一覧]

主な種類 演算子 説明
単項演算子 ++、– ひとつの値に関して処理をおこなう
算術演算子 +、-、*、/、% 四則演算をおこなう
関係演算子 ==、!=、>、<、>=、<= 2つの値に対して評価をおこなう
代入演算子 = 左辺の変数へデータ(変数やリテラルや式の結果)を代入する演算子
複合代入演算子 +=、-=、*=、/=、%= 左辺の変数へデータ(変数やリテラルや式の結果)を再代入する演算子

まずは、演算子の使い方を学習していきましょう。

単項演算子

単項演算子とは、ひとつの値に関して処理をおこなう演算子です。

例題(単項演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec01
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec01 {
/**
* mainメソッド
*/
public static void main(String[] args) {
int n = 0, m = 0; //n,mには0を代入しておく。
n++;
m--;
System.out.println(n);
System.out.println(m);
}

}

コンパイル例:

> javac chapter3¥EnzansiExec01.java

実行例:

> java chapter3.EnzansiExec01
1
-1

++インクリメント--デクリメントといいます。

インクリメントデクリメントはすでに何かの値が入っている変数に対して、その値を1だけ増やしたり減らすという操作を行います。
また、インクリメントデクリメントは前に付けたり(前置)、後ろにつける(後置)ことで働き方が違ってきます。

位置 説明
前置 計算に使う直前に増減する
後置 計算に使った直後に増減する

例題(単項演算子(前置))

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec02
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec02 {
/**
* mainメソッド
*/
public static void main(String[] args) {
int a, b;

a = 10;

//前置の場合
//aを1増やした後で a + 5 を計算する
b = ++a + 5;

System.out.println(a);
System.out.println(b);
}

}

コンパイル例:

> javac chapter3¥EnzansiExec02.java

実行例:

> java chapter3.EnzansiExec02
11
16

式の中前置を使った場合、計算に使う直前に増減します。

例題(単項演算子(後置))

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec03
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec03 {
/**
* mainメソッド
*/
public static void main(String[] args) {
int a, b;

a = 10;

//後置の場合
//a + 5 を計算した後でaを1増やす
b = a++ + 5;

System.out.println(a);
System.out.println(b);
}

}

コンパイル例:

> javac chapter3¥EnzansiExec03.java

実行例:

> java chapter3.EnzansiExec03
11
15

式の中後置を使った場合、計算に使った直後に増減します。

文字列の連結

上記のように2つ以上の文字列を一つに連結したいことがあります。そんな時は文字列演算子+を使います。

例題(文字列と文字列の連結)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec04
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec04 {
/**
* mainメソッド
*/
public static void main(String[] args){
String str = "おはよう" + "佐藤" + "さん";
System.out.println(str);
}

}

コンパイル例:

> javac chapter3¥EnzansiExec04.java

実行例:

> java chapter3.EnzansiExec04
おはよう佐藤さん

例題(文字列と文字列以外の連結)

文字列と文字列以外の型の変数を+した場合には文字列として扱われます。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec05
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec05 {
/**
* mainメソッド
*/
public static void main(String[] args){
int total = 1000;
double tax = 0.1;
System.out.println("合計金額は" + total + "円(税抜)です。" );
System.out.println("合計金額は" + ( total * (1 + tax) ) + "円(税込)です。" );
}

}

コンパイル例:

> javac chapter3¥EnzansiExec05.java

実行例:

> java chapter3.EnzansiExec05
合計金額は1000円(税抜)です。
合計金額は1100円(税込)です。

文字列と文字列以外を+すると結合として処理されます。
尚、カッコ( ) で囲むと一番先に処理されます。

算術演算子

算術演算子とは加減乗算(+、-、×、÷)のことです。Java言語ではこのほかに割った余りを求める剰余演算(モジュロ演算)があります。

例題(算術演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec06
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec06 {
/**
* mainメソッド
*/
public static void main(String[] args) {

//加減乗算
int a = 20;
int b = 30;
int a1, a2, a3, a4, a5;

a1 = a + b;
a2 = a - b;
a3 = a * b;
a4 = a / b;
a5 = a % b;

System.out.println( "a1 = " + a1 );
System.out.println( "a2 = " + a2 );
System.out.println( "a3 = " + a3 );
System.out.println( "a4 = " + a4 );
System.out.println( "a5 = " + a5 );

}

}

コンパイル例:

> javac chapter3¥EnzansiExec06.java

実行例:

> java chapter3.EnzansiExec06
a1 = 50
a2 = -10
a3 = 600
a4 = 0
a5 = 20

代入演算子

=は代入演算子です。何らかの値を変数に代入する演算子です。
したがって=の左側は必ず変数でなければなりません。
=は、以下のような働きの演算子です。

変数 = 式 ;

上記は、右辺の式の値左辺の変数に代入するという意味です。
左辺と右辺が等しいという意味ではないので注意して下さい。

例題(代入演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec07
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec07 {
/**
* mainメソッド
*/
public static void main(String[] args){
int a , b , c;
a = b = c = 5; //a,b,cに5を代入する。
System.out.println( "a = " + a );
System.out.println( "b = " + b );
System.out.println( "c = " + c );
}


}

コンパイル例:

> javac chapter3¥EnzansiExec07.java

実行例:

> java chapter3.EnzansiExec07
a = 5
b = 5
c = 5

=で変数を連結すると、すべての変数を同じ値にすることができます。

a = b = c = 5;

上記、一行の命令を分割すると以下になります。
(内部では①、②、③の順番で実行しています。)

c = 5; ← ① 
b = c; ← ②
a = b; ← ③

複合代入演算子

複合代入演算子は、再代入して、短絡して書くための演算子です。

演算記号 使用例 意味 算術演算子での記述
+= a += b aにbを加えた値をaに代入する a = a + b
-= a -= b aからbを引いた値をaに代入する a = a - b
*= a *= b aにbを乗じた値をaに代入する a = a * b
/= a /= b aをbで割った値をaに代入する a = a / b
%= a %= b aをbで割ったあまりをaに代入する a = a % b

例題(複合代入演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec08
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec08 {
/**
* mainメソッド
*/
public static void main(String[] args){

int a = 0;
//変数aの値を5だけ増やした値にする(a = a + 5;)
a += 5;
System.out.println(a);

int b = 5;
//変数bの値を3だけ減らした値にする(b = b - 3;)
b -= 3;
System.out.println(b);

int c = 2;
//変数cの値を6倍にした値にする(c = c * 6;)
c *= 6;
System.out.println(a);

int d = 12;
//変数dの値を4で割った値にする(d = d / 4;)
d /= 4;
System.out.println(d);

int e = 3;
//変数eの値を2で割ったあまりの値にする(e = e % 4;)
e %= 2;
System.out.println(e);

}
}

コンパイル例:

> javac chapter3¥EnzansiExec08.java

実行例:

> java chapter3.EnzansiExec08
5
2
12
3
1

例題(複合代入演算子(キャスト不要))

複合演算子は本来、キャストしなければならないケースでもキャストしなくても良いという性質があります。

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec09
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec09 {
/**
* mainメソッド
*/
public static void main(String[] args){

int n = 0;

//double型をint型へ代入するがエラーにならない。
n += 15.8;
System.out.println(n);

}
}

コンパイル例:

> javac chapter3¥EnzansiExec09.java

実行例:

> java chapter3.EnzansiExec09
15

関係演算子

関係演算子を使って作る式を関係式と言います。関係演算子の種類は以下です。

関係演算子 使用例 意味
> a > b aはbより大きい
< a < b aはbより小さい
>= a >= b aはb以上
<= a <= b aはb以下
== a == b aとbは等しい
!= a != b aとbは等しくない

関係演算子はリテラルや変数や式を比較するために使います。
関係演算子を使用した式を関係式といいます。

[関係式の例]

a > 0           //aは正の数
a >= 10 //aは10以上
a == 20 //aは20と等しい
a != 0 //aは0ではない

a > b+5 //aはb+5よりも大きい
a > b //aはbよりも大きい
a+b > 5 //a+bは5以上
a+b > c //a+bはc以上
a == b*2 //aはbの2倍と等しい
a%3 == 0 //aはbの3倍である
a+1 != 2 //a+1は2ではない
a+1 != b-2 //a+1はb-2ではない

関係式の値はtruefalseのどちらかになります。

例題(関係演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec10
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec10 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int num0 = Integer.parseInt(args[0]);
System.out.println( num1 > 50 );

}

}

コンパイル例:

> javac chapter3¥EnzansiExec10.java

実行例:

> java chapter3.EnzansiExec10 100
true

> java chapter3.EnzansiExec10 20
false

関係式を表示するにはprintln()メソッドで表示するのが一般的です。println()メソッドの中に式を書くと、式の計算をした結果の値を表示してくれます。

上記の場合、コマンドライン引数で指定した値によってtrueかfalseか違ってきます。
(50を超える値を指定した場合は、true。50以下の場合はfalseになります。)

文字の比較

char型では以下の値は全て「a」を表します。

char c;         
c = 'a'; //文字'a'
c = '¥u0061'; //文字'a'の文字コード
c = 97; //10進数の整数による文字'a'の文字コード
c = 0141; //8進数の整数による文字'a'の文字コード
c = 0x61; //16進数の整数による文字'a'の文字コード

つまり、char型は文字コード番号(整数)を保持する型です。
したがって、整数なので関係演算子を利用して大小を比較することができます。

例題(文字の比較)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec11
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec11 {
/**
* mainメソッド
*/
public static void main(String[] args) {

char ch = 'あ';
//比較だけならdoubleとでも可能
System.out.println( ch > 15.5);

}

}

コンパイル例:

> javac chapter3¥EnzansiExec11.java
true

実行例:

> java chapter3.EnzansiExec11
true

※文字型(char型)は、数値であればどんな方とでも比較は可能です。

論理演算子

論理演算子は関係式の組み合わせて、複雑な条件を作成するために使います。次のような演算子があります。

論理演算子 呼び方 意味
&& 、& 論理積 両方の関係式がtrue(正しい)ときのみ、trueとする
|| 、| 論理和 どちらか1つの関係式でもtrueならtrueとする
! 否定 trueならfalse、falseならtrueに反転する
^ 排他的論理和 片方がtrueでもう片方がfalseのときtrueを返す

例題(論理演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec11
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec11 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);

//aは0より大きく、かつ、10より小さい
boolean a1 = a > 0 && a < 10;
//aは0以下、または、10以上
boolean a2 = a <= 0 || a >= 10;
//aは0より大きく、かつ、10より小さくない
boolean a3 = !( a > 0 && a < 10 );
//aかbのどちらか一方が0
boolean a4 = ( a == 0 ) ^ ( b == 0 );

System.out.println("a > 0 && a < 10 = " + a1 );
System.out.println("a <= 0 || a >= 10 = " + a2 );
System.out.println("!(a > 0 && a < 10 ) = " + a3 );
System.out.println("( a == 0 ) ^ ( b == 0 ) = " + a4 );

}

}

コンパイル例:

> javac chapter3¥EnzansiExec11.java

実行例:

> java chapter3.EnzansiExec11 5 0
a > 0 && a < 10 = true
a <= 0 || a >= 10 = false
!(a > 0 && a < 10 ) = false
( a == 0 ) ^ ( b == 0 ) = true

短絡演算子

通常のプログラミングで、& や | を使うことはありません。常に && や || を使います。それはダブルの演算子( && や || )の方が効率が良いからです。

ダブルの演算子は無駄な検査を省略する機能があるので、短絡演算子と呼びます。

例題(&&演算子の短絡評価)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec12
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec12 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int a = 1 , b = 1;
//式を評価した後、a、bに1を加算する
System.out.println( a++ == 0 && b++ == 0 );
System.out.println("a = "+ a + " b = " + b );

}

}

コンパイル例:

> javac chapter3¥EnzansiExec12.java

実行例:

> java chapter3.EnzansiExec12
false
a=2 b=1

例題(||演算子の短絡評価)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec13
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec13 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int a = 1 , b = 1;
//式を評価した後、a、bに1を加算する
System.out.println( a++ == 0 || b++ == 0);
System.out.println("a = "+ a + " b = " + b);

}

}

コンパイル例:

> javac chapter3¥EnzansiExec13.java

実行例:

> java chapter3.EnzansiExec13
true
a=2 b=1

条件演算子

条件演算子は、条件がtrueかfalseかで違う値になる式を作ります。

条件部に論理式と?を書き、その後trueの時の値とfalseの時の値をコロン(:)で区切って並べます。
3つの項があるので3項演算子とも呼びます。

例題(条件演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter3
クラス EnzansiExec14
package chapter3;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class EnzansiExec14 {
/**
* mainメソッド
*/
public static void main(String[] args) {


int a = Integer.parseInt(args[0]);

//aが2の倍数なら10、そうでなければ20
int n = a % 2 == 0 ? 10 : 20 ;
System.out.println("n = " + n);

}

}

コンパイル例:

> javac chapter3¥EnzansiExec14.java

実行例:

> java chapter3.EnzansiExec14 2
n = 10

優先順位と結合規則

演算子には優先順位結合規則があります。
以下の表は、上にある演算子ほど優先順位が高くなります。

名称 演算子 結合規則
前置インクリメント・デクリメント ++、– ←右
単項プラス・マイナス +、- ←右
キャスト(型変換) (データ型) ←右
乗算、除算、剰余算 *、/、% 左→
加算、減算 +、- 左→
文字列結合 + 左→
代入演算子 = ←右
複合代入演算子 +=、-=、*=、/=、%= ←右
後置インクリメント・デクリメント ++、– 左→

優先順位とは、ひとつの式の中に演算子が混在するとき、どの演算子を先に適用するのかという規則です。
例えば以下のような演算で、+よりも×を優先して、10 × 30 の部分を先に計算するような規則です。

50 + 10 × 30

結合規則とは、ひとつの式の中に同じ優先順位の演算子が複数あるとき、左から順に適用していくか、右から順に適用するのかという規則です。

value = 20 + 30 + 4;
a = b = c = 30;

また()を使うと優先順位や結合規則を強制的に変更することができます。

( 50 + 10 ) × 30

章のまとめ

以下の要点を理解できたら次の章へ進んでください。

基本的な演算子

主な種類 演算子 説明
単項演算子 ++、– ひとつの値に関して処理をおこなう
算術演算子 +、-、*、/、% 四則演算をおこなう
関係演算子 ==、!=、>、<、>=、<= 2つの値に対して評価をおこなう
代入演算子 = 左辺の変数へデータ(変数やリテラルや式の結果)を代入する演算子
複合代入演算子 +=、-=、*=、/=、%= 左辺の変数へデータ(変数やリテラルや式の結果)を再代入する演算子

単項演算子

  • 前置:++aはaを計算に使うに1増やす。–aはaを計算に使うに1減らす
  • 後置:a++はaを計算に使った直後に1増やす。–aはaを計算に使った直後に1減らす
  • 単項演算子は、double型にも使用できる

文字列の連結

  • +は文字列と文字列を結合する連結演算子としても機能する
  • +は文字列と文字列以外の型の変数も連結できる
  • a+bではa、b共に数値型なら+は加算の演算子として働く
  • a+bではaかbのどちらかがString型(文字列)なら連結演算子として働く

算術演算子

  • 単項 + 、単項 - は変数にも使える
  • 剰余は、割った余りを求める
  • 剰余は、double型にも使える

代入演算子

  • =は右辺の値を左辺の変数に代入する演算子である
  • a=b=c; のように多重に使える

複合代入演算子

  • 複合代入演算子は、再代入を行うための演算子である。例) a+=1; b%=5;
  • 再代入される変数は、あらかじめ初期化しておく必要がある。例) a=1; a+=1;
  • 複合代入演算子は、型変換のエラーが起こらない。例) int n=1; n+=1.234; //OK
  • 複合代入演算子は a+=b+=c; のように多重に使える

関係演算子

  • 関係演算子を使って作る式を関係式と呼ぶ
  • 関係演算子はリテラルや変数や式を比較するために使う
  • 関係式の値はtruefalseのどちらかである
  • 変数の値によってtrueになるかfalseになるか決まる
  • 文字型(char型)はユニコード番号(整数)を保持する型で、関係演算子を使って比較することが可能
  • 文字型(char型)は、数値であればどんな方とでも比較は可能です。

論理演算子

  • && 、& は両方の関係式true(正しい)ときのみ、trueとする
  • || 、| はどちらか1つの関係式でもtrueならtrueとする
  • !はtrueならfalsefalseならtrue反転する
  • ^は片方がtrueでもう片方がfalseのときtrueを返す
  • ダブル( &&、|| )の演算子は無駄な検査を省略する機能がある(短絡演算子)

優先順位と結合規則

  • 優先順位とは、ひとつの式の中に演算子が混在するとき、どの演算子を先に適用するのかという規則
  • 結合規則とは、ひとつの式の中に同じ優先順位の演算子が複数あるとき、左から順に適用していくか、右から順に適用するのかという規則