【未経験からのプログラミング講座】STEP2.Javaの基本文法2

Pocket

2. 演算子と代入

2.1. 演算子の種類と説明

演算子とはプログラミングにおいて、演算方法を指示する記号のことです。演算の対象となる値や変数はオペランドといい、「x + 100」の場合「+」が演算子で、「x」、「100」がオペランドです。

(1) 代入演算子

変数に値の代入を行うには代入演算子=を使用します。

[例] XYの値を代入する場合

X = Y;
[例] X10を代入する場合

X = 10;

次に代入演算子を利用したサンプルプログラムを示します。

[DainyuEnzanshi.java]
public class DainyuEnzanshi {
  
    public static void main(String[] args) {
        // int型の変数xを宣言
        int x;
        // int型の変数yを宣言
        int y; 

        // 変数yに10を代入
        y = 10;
        // 変数xに変数yの値を代入
        x = y; 

        // 結果を表示
        System.out.println("変数xの値は " + x + " です。");
        System.out.println("変数yの値は " + y + " です。");
    }
}

実行例は次のようになります。

C:¥java>java DainyuEnzanshi
変数xの値は 10 です。
変数yの値は 10 です。

(2) 算術演算子

Javaでは加算、減算、乗算、除算にはそれぞれ普通の+-*/が使用できます。このようなデータの算術を行う演算子を算術演算子と呼びます。以下が使用できる算術演算子の一覧です。

算術演算子 使用例 説明
+ x+ y xyを足し合わせます(加算)
- x- y xからyを引きます(減算)
* x* y xyを掛け合わせます(乗算)
/ x/ y xyで割ります(除算)
% x% y xyで割った余りを求めます(剰余)

次に算術演算子を利用したサンプルプログラムを示します。

[SanjyutsuEnzanshi.java]
public class SanjyutsuEnzanshi {
  
    public static void main(String[] args) {
        int x = 20;
        int y = 10;

        // 加算
        int a = x + y;
        // 減算
        int b = x - y;
        // 乗算
        int c = x * y;
        // 除算
        int d = x / y;
        // 剰余
        int e = x % y;

        // 結果を表示
        System.out.println("変数aの値は " + a + " です。");
        System.out.println("変数bの値は " + b + " です。");
        System.out.println("変数cの値は " + c + " です。");
        System.out.println("変数dの値は " + d + " です。");
        System.out.println("変数eの値は " + e + " です。");
    }
}

実行例は次のようになります。

C:¥java>java SanjyutsuEnzanshi
変数aの値は 30 です。
変数bの値は 10 です。
変数cの値は 200 です。
変数dの値は 2 です。
変数eの値は 0 です。

(3) 演算子の簡略化

代入演算子算術演算子を組み合わせて式を簡略化することができます。

簡略化された算術演算子 使用例 使用例と同じ意味の式
+= x+= y x = x + y
-= x-= y x = x - y
*= x*= y x = x * y
/= x/= y x = x / y
%= x%= y x = x % y

次に簡略化した演算子を利用したサンプルプログラムを示します。

[KanryakuEnzanshi.java]
public class KanryakuEnzanshi {
  
    public static void main(String args[]) {
        int x = 20;
        int y = 10;

        // x = x + y;と同様
        x += y;
        System.out.println("変数xの値は " + x + " です。");
    }
}

実行例は次のようになります。

C:¥java>java KanryakuEnzanshi
変数xの値は 30 です。

(4) インクリメント演算子、デクリメント演算子

1を足したり、引いたりする演算はよく使用されるので専用の演算子が用意されています。1を足すことをインクリメント、1を引くことをデクリメントと呼びます。インクリメントを行うには変数の前か後に++演算子を付けます。これをインクリメント演算子と呼びます。デクリメントを行うには変数の前か後に--演算子を付けます。これをデクリメント演算子と呼びます。変数の前に演算子を付けた場合と変数の後に演算子をつけた場合とでは意味が違うので注意しなければなりません。

算術演算子 使用例 説明
++ ++x x1を足した後に式を評価します
++ x++ 式を評価した後に1を足します
-- --x xから1引いた後に式を評価します
-- x-- 式を評価した後に1を引きます。

演算子を変数の前につけた場合と後につけた場合の違いを簡単な例で説明します。

[例] 前につけた場合

int x = 10;
int y = ++x;

x11y11になります。x1を足した後にその値をyに代入する動作になります。

[例] 後ろにつけた場合

int x = 10;
int y = x++;

x11y10になります。xの値をyに代入した後にx1を足す動作になります。

次にインクリメント演算子を利用したサンプルプログラムを示します。

[InkurimentoEnzanshi.java]
public class InkurimentoEnzanshi {
  
    public static void main(String[] args) {
        int x;
        int y;
        x = 10;
        
        // 前に付けた場合
        y = ++x;
        
        System.out.println("**前に付けた場合**");
        System.out.println("変数xの値は " + x + " です。");
        System.out.println("変数yの値は " + y + " です。");

        x = 10;
        
        // 後に付けた場合
        y = x++;
        
        System.out.println("**後に付けた場合**");
        System.out.println("変数xの値は " + x + " です。");
        System.out.println("変数yの値は " + y + " です。");
    }
}

実行例は次のようになります。

C:¥java>java InkurimentoEnzanshi
**前に付けた場合**
変数xの値は 11 です。
変数yの値は 11 です。
**後に付けた場合**
変数xの値は 11 です。
変数yの値は 10 です。

(5) 比較演算子

変数の値の大小を調べる場合には比較演算子を使用します。比較演算子を使用した式の結果はtrueまたはfalseboolean型の値になります。

比較演算子 使用例 説明
> x > y xyよりも大きい場合trueになります
>= x >= y xyより大きいか等しい場合trueになります
< x < y xyより小さい場合trueになります
<= x <= y xyより小さいか等しい場合trueになります
== x == y xyが等しい場合trueになります
!= x != y xyが等しくない場合trueになります
[例] xyが等しいかどうか判定する場合

if (x == y) {
  System.out.println("xとyは等しいです");
}

次に比較演算子を利用したサンプルプログラムを示します。

[HikakuEnzanshi.java]
public class HikakuEnzanshi {
  
    public static void main(String[] args) {
        int x = 10;
        int y = 20;

        if (x == y) {
            System.out.println("xとyは等しいです。");
        } else if (x > y) {
            System.out.println("xはyより大きいです。");
        } else if (x < y) {
            System.out.println("xはyより小さいです。");
        }
    }
}

実行例は次のようになります。

C:¥java>java HikakuEnzanshi
xはyより小さいです。

(6) 論理演算子

AかつB、AまたはB、などのように複数の式の条件を組み合わせる場合に使用します。

論理演算子 使用例 説明
&& a && b abの両方がtrueの場合にtrueになります
|| a || b abのいずれかがtrueの場合にtrueになります
! !a afalseの場合にtrueになります
[例] x == y かつ x == zの場合

if (x == y && x == z) {
  System.out.println("'x=yかつy=z'が成り立ちます。");
}

次に比較演算子を利用したサンプルプログラムを示します。

[RonriEnzanshi.java]
public class RonriEnzanshi {
  
    public static void main(String args[]) {
        int x = 10;
        int y = 20;
        int z = 20;
        boolean flag = false;

        if (x == y && y == z) {
            System.out.println("'x=yかつy=z'が成り立ちます。");
        } else {
            System.out.println("'x=yかつy=z'が成り立ちません。");
        }

        if (x == y || y == z) {
            System.out.println("'x=yまたはy=z'が成り立ちます。");
        } else {
            System.out.println("'x=yまたはy=z'が成り立ちません。");
        }

        if (!flag) {
            System.out.println("flagはfalseです。");
        } else {
            System.out.println("flagはtrueです。");
        }
    }
}

実行例は次のようになります。

C:¥java>java RonriEnzanshi
'x=yかつy=z'が成り立ちません。
'x=yまたはy=z'が成り立ちます。
flagはfalseです。

(7) ビット演算子

ビット演算子とは変数に格納されたデータのビットを直接操作するための演算子のことです。

※ビット演算子については実際に利用する機会は少ないため、余裕のある場合のみ内容を確認してください。

ビット演算子 使用例 説明
& x & y xyが整数型の場合、xyのビットごとのAND演算を行う
| x | y xyが整数型の場合、xyのビットことのOR演算を行う
^ x ^ y xyが整数型の場合、xyのビットごとのXOR演算を行う
~ ~x xが整数型の場合、xのビットごとのNOT演算を行う
(ア) AND演算(&)

論理積演算とも呼ばれます。入力されたビットが両方とも1の場合に1を出力する演算です。

入力1 入力2 出力
0 0 0
0 1 0
1 0 0
1 1 1
(イ) OR演算(|)

論理和演算とも呼ばれます。入力されたビットのいずれかが1の場合に1を出力する演算です。

入力1 入力2 出力
0 0 0
0 1 1
1 0 1
1 1 1
(ウ) XOR演算(^)

排他的論理和演算とも呼ばれます。入力された2つのビットが異なっていた場合1を出力する演算です。

入力1 入力2 出力
0 0 0
0 1 1
1 0 1
1 1 0
(エ) NOT演算(~)

論理否定演算とも呼ばれます。入力されたビットを反転して出力する演算です。

入力 出力
0 1
1 0

次にビット演算子を利用したサンプルプログラムを示します。

[BitEnzanshi.java]

public class BitEnzanshi {
  
    public static void main(String[] args) {
        // ビット表現 00000011
        byte b1 = 3;
        // ビット表現 00001001
        byte b2 = 9;

        // i1のビット表現 00000000 00000000 00000000 00000001
        int i1 = b1 & b2;
        // i2のビット表現 00000000 00000000 00000000 00001011
        int i2 = b1 | b2;
        // i3のビット表現 00000000 00000000 00000000 00001010
        int i3 = b1 ^ b2;
        // i4のビット表現 11111111 11111111 11111111 11111100
        int i4 = ~b1;

        System.out.println("i1の値は " + i1 + " です。");
        System.out.println("i2の値は " + i2 + " です。");
        System.out.println("i3の値は " + i3 + " です。");
        System.out.println("i4の値は " + i4 + " です。");
    }
}

実行例は次のようになります。

C:¥java>java BitEnzanshi
i1の値は 1 です。
i2の値は 11 です。
i3の値は 10 です。
i4の値は -4 です。

(8) シフト演算子

ビットを直接操作するためにシフト演算子を使用することができます。シフトとはビットを右または左にずらす操作のことです。

※シフト演算子については実際に利用する機会は少ないため、余裕のある場合のみ内容を確認してください。

シフト演算子 使用例 説明
<< x << a xのビットをaビットだけ左にシフトさせる。右端には0が入る。一般に、nビット左にシフトすると元の数に2nかけた値になります。
>> x >> a xのビットをaビットだけ右にシフトさせる。左端には最上位ビットと同じ値が入る。一般に、nビット右にシフトする元の数を2nで割った値になります。(算術右シフト)
>>> x >>> a xのビットをaビットだけ右にシフトさせる。左端には0が入る。左端に0が入るので符号の区別がない演算に使用します。(論理右シフト)
[例] int型の値2を5ビット左にシフトする場合( 2 << 5 )

  10進数 2進数
演算前 2 00000000 00000000 00000000 00000010
演算後 2 × 2の5乗 = 64 00000000 00000000 00000000 01000000
[例] int型の値-64を5ビット右にシフトする場合( -64 >> 5 )

  10進数 2進数
演算前 -64 00000000 00000000 00000000 11000000
演算後 -64 ÷ 2の5乗 = -2 00000000 00000000 00000000 11111110

次にシフト演算子を利用したサンプルプログラムを示します。

[ShiftEnzanshi.java]
public class ShiftEnzanshi {
  
    public static void main(String args[]) {
        // ビット表現 00000011
        byte b1 = 3;

        // i1のビット表現 00000000 00000000 00000000 00000110
        int i1 = b1 << 1;
        // i2のビット表現 00000000 00000000 00000000 00011000
        int i2 = b1 << 3;

        System.out.println("i1の値は " + i1 + " です。");
        System.out.println("i2の値は " + i2 + " です。");
    }
}

実行例は次のようになります。

C:¥java>java ShiftEnzanshi
i1の値は 6 です。
i2の値は 24 です。

(9) 三項演算子

演算子には、単項演算子二項演算子三項演算子の3種類あります。単項演算子は+50++xなどのように演算対象が1つの演算子のことです。二項演算子は5 + 10x >= yのように演算対象が2つの演算子のことです。これらに対して、三項演算子は演算対象が3つある演算子のことをいいます。

三項演算子 使用例 説明
?: A ? x : y Atrueならxの式を評価した値を返し、Afalseならyの式を評価した値を返します。

次に三項演算子を利用したサンプルプログラムを示します。

[SankouEnzanshi.java]
public class SankouEnzanshi {
  
    public static void main(String args[]) {
        int x = 10;
        int y = 20;

        String s = x == y ? "同じ" : "違う";

        // 結果を表示
        System.out.println("sの値は " + s + " です。");
    }
}

実行例は次のようになります。

C:¥java>java SankouEnzanshi
sの値は 違う です。

(10) 演算子の優先順位

複数の演算子を組み合わせて1つの式にする場合、どの演算から処理が行われるか決める演算子の優先順位が存在します。例えば以下の例の場合、最初にb * cが行われてその次にaが足されます。これは演算子*が演算子+よりも優先順位が高いためです。

[例]
a + b * c

以下が演算子の優先順位を表にしたものです。

優先順位 出力
高い . [] ()
++ -- ! ~
new (キャストするための型)
* / %
+ -
  << >> >>>
  > >= < <= instanceof
== !=
& ^ |
&& ||
?:
低い = += -= *= /= %= &= ^= |= <<= >>= >>>=

2.2. 演習問題

(1) 以下の内容に従ったプログラムを作成しなさい。

・ クラス名はKeisanとする。

numという名前のint型変数を宣言する。
rateという名前のfloat型変数を宣言する。
・ 変数numには「150」、変数rateには「10.5」を代入する。
・ 最後にprintln()ステートメントを使い、変数numと変数rateの値に対して以下の算術計算を行い結果を表示する。

加算減算乗算除算剰余

・ 表示結果は以下のようになる。

160.5
139.5
1575.0
14.285714
3.0

(2) 以下の内容に従ったプログラムを作成しなさい。

・ クラス名はIncrementとする。
num1という名前のint型の変数を宣言する。
num2という名前のint型の変数を宣言する。
・ 変数num1に値「1」を代入する。
num2num1の値を代入する際にインクリメント演算子を利用して変数num1には「2」を、num2には「1」を代入する。
・ 最後にprintln()ステートメントを使い、変数num1と変数num2の値を表示する。

・ 表示結果は以下のようになる。

2
1

(3) 以下の内容に従ったプログラムを作成しなさい。

・ クラス名はHikakuとする。
int型の変数num1num2num3を宣言する。
boolean型の変数judge1judge2judge3judge4を宣言する。
・ 変数num1には「1」を、num2には「1」を、num3には「2」を代入する。
・ 変数num1の値がnum2の値よりも大きいかどうかを評価し、結果を変数judge1に代入する。
・ 変数num1の値がnum2の値以下であるかを評価し、結果を変数judge2に代入する。
・ 変数num1の値とnum3の値が等しい、且つnum1の値がnum2の値以上であるかを評価し、結果を変数judge3に代入する。
・ 変数num1の値とnum3の値が等しい、あるいはnum1の値がnum2の値以上であるかを評価し、結果を変数judge4に代入する。
・ 最後にprintln()ステートメントを使い、変数judge1judge2judge3judge4の値を表示する。

・ 結果は以下のようになる。

false
true
false
true