【連載7】Java演算子とは何か?演算子から読み解くコンピュータの仕組み

コンピュータは何でもできるというイメージがあるかもしれませんが、突き詰めればただの「計算機」であり、最も得意とすることは「演算」(つまり、計算すること)です。

コンピュータを「何でもできる魔法の箱」と表現されることもよくあります。表面から見るとその表現は正しく思えますが、裏側から見ると実際はそうではなく「計算箱」と表現した方がしっくりきます。

しかし、「ただの計算箱」という風に捉えてしまうのは早計であり、コンピュータはその特技に関しては抜きんでています。その演算スピードは計り知れず、人間ではとても真似できない速度で計算してくれます。

では、コンピュータが行える「演算」として、どんなものがあるでしょう。これも人間では真似できない、「よくわからないけどすごい演算」ができるのではないかと思うかもしれませんが、そうではありません。

私たちが普段の日常生活の中で使っている「演算」と何ら変わりありません。

今回の記事では、コンピュータはどのような演算ができるのか、その点について考えていきます。

演算子

プログラミングとは「入力した複数のデータに対して何らかの演算を行い、その結果を出力する」突き詰めれば、そのようなプログラムを作成することと言えます。

コンピュータに演算させるには、どのような演算を行うかを指示してやる必要があります。

その指示を行うために用いるのが「演算子」です。

では演算子と何なのでしょうか。その実態は、足し算や掛け算といた数値計算や値の大小を比較する際に使われる記号のことです。

演算子の種類

コンピュータが扱える演算子の種類として主に以下の3つが挙げられます。

演算子の種類

・算術演算子
・比較演算子
・論理演算子

どのようなものなのか、ひとつずつ見ていきます。

算術演算子

演算といえばまず思い浮かぶのは「四則演算」ではないでしょうか。数字を扱う上での基本中の基本です。その四則演算を行う演算子を「算術演算子」と言います。

算術演算子には下表のような種類があります。

演算子意味記入例
+足し算a = b + c;
引き算a = b – c;
*掛け算a = b * c;
/割り算a = b / c;
%余りa = b % c;
++インクリメントa++; ++a;
– –デクリメントa--; --a;

これらのうち、耳にしたことがないのがインクリメント演算子とデクリメント演算子になるかと思います。それらの説明は後にして、まずは基本的な四則演算のサンプルコードを示します。

掛け算が「*」、割り算が「/」記号を使っている点と文字を結合することを指示する「+」演算子について注意してください。(後ほど解説します。)

public class EnSample01{
    public static void main(String[] args){
        int num1;
        int num2;
        int answer;
        
        num1 = 4;
        num2 = 2;
        
        answer = num1 + num2;
        System.out.println("num1 + num2 = " + answer);
        
        answer = num1 - num2;
        System.out.println("num1 - num2 = " + answer);
        
        answer = num1 * num2;
        System.out.println("num1 * num2 = " + answer);

        answer = num1 / num2;
        System.out.println("num1 / num2 = " + answer);
        
        answer = num1 % num2;
        System.out.println("num1 % num2 = " + answer);
    }
}

上記サンプルコードを実際に動かしてみましょう。

テキストエディタで上記コードを入力し、入力が終わったら、ファイルを保存します。
以下には、”C:\Users\USER\Documents”フォルダの配下に、ファイル名を”EnSample01.java”として保存した場合の例を示します。

ファイルを作成したら、コンパイルを行います。
そのために、コマンドプロンプトを起動し、先ほど作成した”EnSample01.java”が保存されているフォルダにカレントフォルダを移してください。

> cd C:\Users\USER\Documents

次に、javacを実行し、コンパイルします。

> javac -encoding UTF-8 EnSample01.java

コンパイルに成功したら、生成されたバイトコードをJava仮想マシンを介して実行します。

> java EnSample01
num1 + num2 = 6
num1 - num2 = 2
num1 * num2 = 8
num1 / num2 = 2
num1 % num2 = 0

「num1」変数に4、「num2」変数に2という整数を格納し、それぞれ四則演算を行っています。

また、%演算子は割り算(除算)した結果の余りを求めています。

上記例だと「4 / 2」の余りは0なので、結果も0となっています。

さて、ここで以下のステートメントに着目してください。

System.out.println("num1 + num2 = " + answer);

まずダブルクォーテーション(”)で囲った部分は文字列として扱われます。つまり、”num1 + num2 = “の部分は「num1 + num2 = 」という文字列を表すことになります。

その後で、「+」演算子を使っていますが、この際は加算(足し算)を指示しているわけではなく、文字列の結合を指示しています。

ややこしいのですが、「+」記号は2つの役割を持っており、整数どうしの演算で使用すれば「加算」を指示し、文字列に対して使用すれば「結合」を指示することになります。

つまり、

 ”num1 + num2 = ” + answer

は、以下の結果となります。

 num1 + num2 = 6

※6は「answer」変数に格納されている値

ややこしくなってきましたので、以下の出力結果がどうなるか少し考えてみてください。

System.out.println("1" + "2");

出力結果として3になるように思えますが、正解は12となります。

ダブルクォーテーションで囲った部分は文字列として扱われるので、ここでの「+」演算子は、加算ではなく、結合を意味しているというわけです。

インクリメント

インクリメントは変数の値を1増やす演算のことです。

まずは以下のサンプルコードを見てください。

public class EnSample02{
    public static void main(String[] args){
        int num1;
        int num2;
        int answer;
        
        num1 = 5;
        num2 = 5;
        
        answer = num1++;
        System.out.println("num1 = " + answer);
        
        answer = ++num2;
        System.out.println("num2 = " + answer);
    }
}
num1 = 5
num2 = 6

前述のとおり、インクリメントは変数の値を1増やす演算です。

例えば、a++と++aはともにaの値をひとつ増やしたもの(インクリメントしたもの)をaに代入します。

両者の違いはインクリメントするタイミングです。
a++は、そのステートメントを実行した後にインクリメントされ、++aは実行する前にインクリメントを行います。

上記を踏まえ、サンプルコードを考えてみます。

実行結果がnum1、num2で異なっています。

これこそがインクリメントする(値をひとつ増やす)タイミングの違いです。

num1++のイメージは以下になります。

上図では「代入してから」と書きましたが、代入に限らず、「ステートメント(1命令文)の実行後にインクリメントされる」と覚えてください。

対して、++num2のイメージは以下になります。

ステートメント実行前にインクリメントされるということです。

デクリメント

デクリメントもインクリメントと考え方は同じです。違いは、値を1増やすか、減らすかです。

例えば、a–と–aはともにaの値をひとつ減らしたもの(デクリメントしたもの)をaに代入します。

さて、インクリメントもデクリメントも以下のように記述しても結果は同じです。

a = a + 1;
a = a++;

a = a - 1;
a = a--;

やってることは同じなのですが、インクリメント、デクリメント演算子を使った方が少ない文字数で記述できますし、何より、値を1加算、減算したいという意図がはっきり伝わり、ソースコードの読みやすさを高めることになります。

プログラミングをしていく上で、値を1加算、減算という場面は多く、これらの演算子はよく使うことになるので、ここでしっかり覚えておきましょう。

演算子の簡略化

算術演算子と=演算子(代入演算子)をくっつけて式を簡略化することも可能です。

演算子意味記入例
+=a = a + ba += b;
-=a = a – ba -= b;
*=a = a * ba *= b;
/=a = a / ba /= b;
%=a = a % ba %= b;

上表のような書き方をすることも非常に多いです。ソースコードはなるべく短く、簡潔にするというのは可読性を高める意味でも大事なことですので、このような書き方も覚えておきましょう。

比較演算子

比較演算子は、文字通り2つの値を比較することが目的の演算子です。この後の記事で見ていくif文やfor文・while文などのループ処理の条件式に使われることが多いです。

2つの値を「比較する」ということも、コンピュータの世界では演算のひとつであり、算術演算子同様とてもよく使われるものです。

比較演算子には下表のような種類があります。

演算子意味記述例
<左の値が右の値より小さい場合にtrueを返し、大きい又は等しい場合にはfalseを返す。x < y;
>左の値が右の値より大きい場合にtrueを返し、小さい又は等しい場合にはfalseを返す。x > y;
<=左の値が右の値以下の場合にtrueを返し、大きい場合にはfalseを返す。x <= y;
>=左の値が右の値以上の場合にtrueを返し、小さい場合にはfalseを返す。x >= y;
==左の値が右の値と等しい場合にtrueを返し、異なる場合にはfalseを返す。x == y;
!=左の値が右の値と異なる場合にtrueを返し、等しい場合にはfalseを返す。x != y;

※ここでは「左の値」「右の値」と表現しましたが、オペランドという用語を使うことがあります。オペランドとは、演算の対象となる値や変数のことで、「x < y」という式では、xを左オペランド、yを右オペランドと表現します。

比較演算子は演算子の「左の値」と「右の値」を比較して、その結果をtrueまたはfalseで値を返します。

比較演算子を用いたサンプルコードを以下に記載します。

public class EnSample03{
    public static void main(String[] args) {
        int x = 1;
        int y = 2;
        boolean result = x < y;
        System.out.println(result);
    }
}

上記サンプルでは変数x、yを宣言し、それぞれ1、2で初期化しています。

boolean型変数resultに「x < y」(xよりもyが大きいかどうか)を比較した結果を格納しています。

結果は、xよりyの方が大きいのでtrueが返り、その値を画面に出力しています。

論理演算子

論理演算子とは、文字通り論理を評価するための演算子のことです。

比較演算子だけでは複数の条件を組み合わせることはできません。論理演算子を使うことで、複数の条件を組み合わせて分岐処理を記述できるなど、複雑な条件を作ることができます。

論理演算子の詳細については、別途if文についての解説記事で見ていきます。

ここではまず、論理演算子の種類とその概要についておさえてください。下表のような種類があります。

演算子意味記入例
&&かつ(And)(x == y) && (a == b);
||または(Or)(x == y) || (a == b);
!でない(Not)!(x == y);

サンプルコードを以下に記載します。

public class EnSample04{
    public static void main(String[] args) {
        int x = 3;
        int y = 3;
        int a = 9;
        int b = 9;

        if((x == y) && (a == b)){
            System.out.println("xとy かつ aとbは値が一致します。");
        }else{
            System.out.println("値は一致しません。");
        }
    }
}
xとy かつ aとbは値が一致します。

まとめ

今回の記事では、コンピュータが行える演算にはどんなものがあるのかについて考えてきました。

演算をする指示する演算子には、算術演算子、比較演算子、論理演算子という種類があります。

それらを駆使することで、コンピュータは本当にたくさんのことができるようになります。

そしてコンピュータに何をやってもらうのか、それを指示するのがプログラミングになります。