プログラムでは、足し算、引き算、掛け算、割り算などの計算をすることが非常に多いです。

これらの4つの計算は四則演算と呼ばれています。

ここでは、これらの計算方法について説明します。

演算

C言語で行うことができる代表的な演算は、足し算、引き算、掛け算、割り算とさらに剰余算です。

最初の4つは知っていると思いますが、剰余算は聞きなれない人もいると思うので、説明をしておきます。

剰余算とは、整数同士の割り算を行った際に発生する余りのことです。

例えば、5÷3 の場合、1余り2となり、剰余算の結果は2となります。

それぞれの計算方法をみて行く前に、代入について説明しておきます。

代入

代入とは、変数に値を入れることです。

次のソースコードでは、int 型の変数aに5という数字を代入しています。

#include <stdio.h>
int main(void)
{
    int a;

    a = 5;

    printf("変数aの値は%dです\n", a);

    return 0;
}

実行すると、「変数aの値5です」と表示されます。

代入は、「a = 5」のようにイコールを利用し、イコールの左側に代入先の変数を、右側に代入したい値を指定します。

このように、変数に5という数字を代入しておくことによって、scanf関数を使った入力と同じように、変数に値を入れておくことができます。

ちなみに、変数への代入は別の場所でもでき、このように int a; の部分ですることも可能です。

#include <stdio.h>

int main(void)
{
    int a = 5;

    printf("変数aの値は%dです\n", a);

    return 0;
}

さらに、変数に別の変数の値を代入することもできます。

#include <stdio.h>

int main(void)
{
    int a = 5;
    int b;

    b = a;

    printf("変数bの値は%dです\n", b);

    return 0;
}

この場合、実行すると「変数bの値は5です」と出力されます。

四則演算

代入について理解した上で、演算について説明していきます。

ここに、足し算、引き算、掛け算、割り算、剰余算のソースコードを示します。

#include <stdio.h>

int main(void)
{
    int sum, sub, mul, div, sur;

    sum = 5 + 3; // 足し算
    sub = 5 - 3; // 引き算
    mul = 5 * 3; // 掛け算
    div = 5 / 3; // 割り算
    sur = 5 % 3; // 剰余算

    printf("5 + 3の結果は%dです\n", sum);
    printf("5 - 3の結果は%dです\n", sub);
    printf("5 * 3の結果は%dです\n", mul);
    printf("5 / 3の結果は%dです\n", div);
    printf("5 %% 3の結果は%dです\n", sur);

    return 0;
}

それぞれ、+ は足し算、- は引き算、* は掛け算、/ は 割り算、% は剰余算を表す記号です。

足し算や引き算は普段使用する記号なので、みてわかると思いますが、それ以外の掛け算や割り算、さらに剰余算で使用している記号は、普段見慣れない記号だと思います。

実行すると、5 / 3 の割り算の結果は 1 となり、1.666……とはなりません。

どうしてこのような結果になるのかというと、計算に使用している5や3という数字が整数であるからです。このように整数同士の計算では結果が小数となることはなく、必ず整数となります。

さらに、「printf(“5%%3の結果は%dです\n”, sur);」の部分で %% と二つの % を書いていますが、これはprintf関数において、% には特別な意味があるため % を表示するためには、% を2つ書く必要があります。

計算には変数を使うことができるので、上のソースコードを次のように、変数を使って計算するように書き換えることもできます。

#include <stdio.h>

int main(void)
{
    int a = 5, b = 3;
    int sum, sub, mul, div, sur;

    sum = a + b; // 足し算
    sub = a - b; // 引き算
    mul = a * b; // 掛け算
    div = a / b; // 割り算
    sur = a % b; // 剰余算

    printf("5+3の結果は%dです\n", sum);
    printf("5-3の結果は%dです\n", sub);
    printf("5*3の結果は%dです\n", mul);
    printf("5/3の結果は%dです\n", div);
    printf("5%%3の結果は%dです\n", sur);

    return 0;
}

複合代入

計算において、変数の値を増やしたり減らしたりして、その変数自体の値を変えたいということがあると思います。

その場合、このような2つの方法が使えます。

#include <stdio.h>

int main(void)
{
    int a = 5;

    a = a + 5;

    printf("結果は%dです\n", a);

    a += 5;

    printf("結果は%dです\n", a);

    return 0;
}

今回、変数名はaとしており、「a = a + 5」や「a += 5」のようにして a に代入されている値に5を足しています。これらはどちらも変数の値に対して 5 を足しています。

これらの計算のうち「a += 5」のようなイコールの前に演算子を書く代入を「複合代入」と呼びます。

このソースコードでは足し算の複合代入を例にしましたが、+ の部分を引き算、掛け算、割り算、剰余算の記号に変えることで、それらでも複合代入ができます。

インクリメントとデクリメント

C言語には、変数の値を1だけ増やしたり減らしたりする、「インクリメント演算子」や「デクリメント演算子」というものがあります。

インクリメントとは値を1増やすこと、デクリメントとは値を1減らすことを表します。

それぞれ、使い方によって、「前置インクリメントと後置インクリメント」「前置デクリメントと後置デクリメント」というものがあります。

使い方はこのようになっています。

#include <stdio.h>

int main(void)
{
    int a;

    a = 5;

    printf("++aの値は%dです\n", ++a);
    printf("--aの値は%dです\n", --a);
    printf("a++の値は%dです\n", a++);
    printf("a--の値は%dです\n", a--);
    printf("  aの値は%dです\n", a);

    return 0;
}

インクリメントやデクリメントは、複合代入と同じように、変数の値を変えるための特別な書き方です。

前置や後置という言葉は、それぞれ値を1増やす「++」と1減らす「–」の位置を表しており、前にあれば前置、後ろにあれば後置と呼ばれます。

前置や後置では、結果が異なります。

前置では、先にインクリメントやデクリメントが行われます。そのため++a の場合1増えてから評価されます。

後置では、後にインクリメントやデクリメントが行われます。そのためa++の場合、式を評価してからaの値を1増やしています。

式とは、値を決定するために書いたものを指し、決定することを評価と言います。

変数a がある際に「a」とだけ書いたら、a が式となり、評価されることで a に代入されている値が決定します。

「a++ や a–」などのインクリメントやデクリメントも式であり、前置や後置で評価されるタイミングが異なるので、このように表示が変わります。

今はあまり使いませんが、今後、繰り返しの処理で使うことになるので、覚えましょう。

優先順位

通常の計算において、足し算や引き算は掛け算や割り算の後に行われます。

これは、プログラムにおいても同じです。

なので、「3 + 3 * 5」のような計算をした場合、掛け算の方が先に計算され、結果は18となります。もし、足し算の方から計算したいという場合は、かっこを利用して、「(3 + 3) * 5」と書く必要があります。

結構、間違えやすいところでもあるので、計算をするときには注意するようにしましょう。

キャスト

整数同士の割り算では、計算結果が整数となるということは既に説明しました。

では、計算結果を小数としたい場合にどうすれば良いのかというと、計算の途中に小数を書きます。

すぐに思い浮かぶ、小数を使って割り算をする方法にはふたつあります。

#include <stdio.h>

int main(void)
{
    double a = 5.0, b = 3.0;
    double div;

    div = 5.0 / 3; // 割り算

    printf("5/3の結果は%fです\n", div);

    div = a / b;

    printf("5/3の結果は%fです\n", div);

    return 0;
}

このように、計算中の数字に.0 をつけて整数ではなく小数として表現する方法や、小数を表す変数である double 型の変数を計算に利用する方法があります。

気をつけて欲しいのが、計算結果が小数となっているので、その値を代入する先の変数の型は double 型である必要があります。

このほかにも「キャスト」という方法を使うことで、結果を小数とすることができます。

キャストによって、int 型の値である整数を double 型の値である小数にしたり、その逆である double 型の値である小数を int 型の整数に変換することができます。

実際にキャストを使ったソースコードがこちらです。

#include <stdio.h>

int main(void)
{
    double div;

    div = (double)5 / 3; // 割り算

    printf("5/3の結果は%fです\n", div);

    return 0;
}

ここでは、5という整数をキャストによって小数にして、計算しています。

このように、キャストしたい(変換したい)数字の前にキャスト先の変数の型をカッコで囲って書くことで、その数字をキャストすることができます。

数字ではなく、変数をキャストすることも可能です。

他にも、小数(double型)から整数(int型)に値を変えたい場合はこのようにします。

#include <stdio.h>

int main(void)
{
    double div;

    div = 5.0 / 3; // 割り算

    printf("5/3の結果は%dです\n", (int)div);

    return 0;
}

ここでは、5/3 の計算の結果を小数で求めて、その結果が代入された div の値をキャストによって、整数に変換して表示しています。

この時、double 型から int 型にキャストをすると、小数部分が切り捨てされます。つまり1.666という小数の場合 int 型にキャストすると、小数部分が切り捨てされて、1 となります。

初心者がつまづきやすい部分のひとつなのでなるべく気をつけましょう。

少し話が戻りますが、小数を、整数を扱う int 型の変数に代入するとどうなるのかというと、

自動的にその変数が double 型の変数にキャストされ、小数を扱うことが可能になります。

しかし、このようなキャストを頻繁に使っていると、その変数の型が int 型か、 double 型か分かりにくくなり混乱の元です。

なので、できるだけ int 型では整数のみを扱うようにしましょう。

初期化

今まで、変数を使ってきましたが、変数は何も代入していない状態ではどのような値になっているのか分かりません。

そのため、変数に代入されている値を使いたい場合は、その変数にすでに値が代入されているのか、把握しておく必要があります。

しかし、大きなプログラムになればなるほど把握するのは難しくなります。

そこで、あらかじめ変数を用意しておくときに、変数に何か値を代入しておく、初期化という方法を使うことがあります。

初期化は、変数を用意しておくときに、あらかじめ変数に値を代入しておくことなので、このようにします。

#include <stdio.h>

int main(void)
{
    int a = 5;

    printf("変数aの値は%dです\n", a);

    return 0;
}

このように、変数を用意しておく場所で、値を代入することを初期化と言います。

初期化などで、値が代入されていない変数を表示しようとすると、デタラメな数字が表示され、バグと呼ばれるプログラムが異常な動作をする原因となるので、気をつけましょう。

まとめ

ここでは、計算の方法とそれに関係するキャストについて説明しました。

キャストについて、理解していないと思わぬ落とし穴にハマることがあります。

計算方法とキャストについてしっかり覚えて、次の説明に進みましょう。