【C言語入門講座】5章.計算の基本と四則演算や演算子の使い方

C言語入門レッスン
C言語入門レッスン

☜前の章へ 変数の使い方(宣言・代入・初期化・型・出力)
☞次の章へ 条件分岐をしてみよう


【C言語入門講座】は全13章から構成される、初心者向けのC言語学習コンテンツです。1章から13章まで学習して頂くことでC言語の基礎を学習することができます。

この記事で分かること
  1. C言語の計算方法
  2. インクリメント・デクリメントのやり方
  3. 前置と後置の違い
  4. 演算子の優先順位と優先順位一覧
  5. 型変換(キャスト)のやり方

この章では、C言語での基本的な計算方法について学んでいきます。

インクリメントなどよく分からない単語があると思いますが、1つ1つ覚えていきましょう。

普通の計算方法から効率的な計算方法まで解説していきます。

C言語の計算方法(足し算・引き算・割り算・掛け算・剰余算)

※上記の青い文字から読みたい項目へ移動することができます

演算子一覧

演算子名前記述例意味
+加算演算子a + baにbを加える
減算演算子a – baからbを引く
*乗算演算子a * baにbを掛ける
/除算演算子a / baをbで割る
%剰余演算子a % baをbで割った余り
表:C言語の演算子

C言語の計算は上記の演算子を使用して行います。

1つ1つ確認していきましょう。

C言語の計算方法:足し算

足し算の仕方
  • 1 + 1
#include <stdio.h>
int main() {
    
    int add;

    add = 1 + 1;

    printf("足し算の結果は%dです。", add);

    return 0; 
}

出力結果

足し算の結果は2です。

足し算は以下のように行っています。

 add = 1 + 1;

足し算は日常生活で足し算をする時と同じように、1 + 1で行うことが出来ます。

C言語の計算方法:引き算

引き算の仕方
  • 5 – 2
#include <stdio.h>
int main() {
    
    int sub;

    sub = 5 - 2;

    printf("引き算の結果は%dです。", sub);

    return 0; 
}

出力結果

引き算の結果は3です。

引き算は以下のように行っています。

 sub = 5 - 2;

日常生活で引き算をする時と同じように、5 – 2で行うことが出来ます。

C言語の計算方法:掛け算

掛け算の仕方
  • 4 * 4
#include <stdio.h>
int main() {
    
    int mul;

    mul = 4 * 4;

    printf("掛け算の結果は%dです。", mul);

    return 0; 
}

出力結果

掛け算の結果は16です。

掛け算は以下のように行っています。

mul = 4 * 4;

日常生活で掛け算をする時は「4 × 4」としますが、C言語では*(アスタリスク)を使います。

C言語の計算方法:割り算

割り算の仕方
  • 6 / 2
#include <stdio.h>
int main() {
    
    int div;

    div = 6 / 2;

    printf("割り算の結果は%dです。", div);

    return 0; 
}

出力結果

割り算の結果3です。

割り算は以下のように行っています。

 div = 6 / 2;

日常生活で割り算をする時は「6 ÷ 2」としますが、C言語では/(スラッシュ)を使います。

C言語の計算方法:剰余算

剰余算とは、割り算の余りを求める計算のことです。

剰余算の仕方
  • 8 % 3
#include <stdio.h>
int main() {
    
    int rem;

    rem = 8 % 3;

    printf("剰余算の結果は%dです。", rem);

    return 0; 
}

出力結果

剰余算の結果2です。

8を2で割ると3余り2になるため、出力結果は2になります。

剰余算は以下のように行っています。

 rem = 8 % 3;

剰余算には%(パーセント)を使います。

C言語の変数を使った計算の方法

#include <stdio.h>

int main(void)
{
    int add = 1;

    add = add + 1;

    printf("足し算の結果は%dです。\n", add);

    return 0;
}

出力結果

足し算の結果は2です。

この様に、変数addに1を加算して、addに代入をすることもできます。

C言語のインクリメントとデクリメントのやり方

インクリメントの仕方
  • 変数名++;
  • ++変数名;
デクリメントの仕方
  • 変数名- -;
  • – -変数名;

先ほどは、add + 1という形で1を足しました。
1だけ足す、1だけ引くという計算は多々行われます。

そのため、簡単に計算ができるように、インクリメント演算子(++)とデクリメント演算子(- -)というものがあります。

1だけ足すことをインクリメント、1だけ引くことをデクリメントと言います

インクリメント演算子とデクリメント演算子

演算子名前記述例意味
++インクリメント演算子++a or a++aに1を加える
– –デクリメント演算子– -a or a- –aから1を引く
表:インクリメント演算子とデクリメント演算子

変数の前に書くことを前置、後ろに書くことを後置と言います。

#include <stdio.h>

int main(void)
{
    int add = 1;
    int sub = 2;

    add++;
    sub--;

    printf("インクリメントの結果は%dです。\n", add);
    printf("デクリメントの結果は%dです。\n", sub);

    ++add;
    --sub;

    printf("インクリメントの結果は%dです。\n", add);
    printf("デクリメントの結果は%dです。\n", sub);

    return 0;
}

出力結果

インクリメントとデクリメントの結果

このように簡単に、プラス1、マイナス1の計算を行うことが出来ます。

C言語の前置と後置の違い

先ほどの計算結果を見て不思議に思いませんでしたか?
add++も++addもaddに1を加えました。何か違いがあるのでしょうか?
実は代入の時に違いが見られます。

まずは後置の場合を見てみましょう。

#include <stdio.h>

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

    b = a++;

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

    return 0;
}

出力結果

aの値は3です。Bの値は2です。

上記の例ではbに3が入りそうですが、実際には2が代入されます。

++がaの後ろ、つまり後置の場合は、aがインクリメントされる前に、aの値がbに代入されます
代入された後にaがインクリメントされます

以下と同じことが行われています。

#include <stdio.h>

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

    b = a;
    a = a + 1;

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

    return 0;
}

前置の場合も確認してみましょう。

#include <stdio.h>

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

    b = ++a;

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

    return 0;
}

出力結果

aの値は3です。Bの値は3です。

前置の場合は、bの値が3になっています。
つまり、aがインクリメントされた後に、代入が行われています

以下と同じことが行われています。

#include <stdio.h>

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

    a = a + 1;
    b = a;

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

    return 0;
}

C言語の複合代入演算子の使い方

これまで、「a = a + 5」この様に、ある変数に加算したい場面が出てきました。

1を加算(インクリメント)、減算(デクリメント)する場合の簡単な書き方は覚えましたが、1以外を加算等する場面でも、簡単に書く方法があります。

簡単に書くためには複合代入演算子を使います。

複合代入演算子

演算子記述例意味
+=a += 2a = a + 2
-=a -= 3a = a – 3
*=a *= 5a = a * 5
/=a /= 7a = a / 7
%=a %= 10a = a %10
表:複合代入演算子

「a = a + 2」は「a += 2」と書いても同じ結果になります。
aを1文字短縮することが出来ました。

#include <stdio.h>

int main(void)
{
    int num1 = 5;
    int num2 = 5;
    int num3 = 5;
    int num4 = 4;
    int num5 = 5;
    int a = 2;

    num1 += a;
    num2 -= a;
    num3 *= a;
    num4 /= a;
    num5 %= a;

    printf("num1の値は%dです。\n", num1);
    printf("num2の値は%dです。\n", num2);
    printf("num3の値は%dです。\n", num3);
    printf("num4の値は%dです。\n", num4);
    printf("num5の値は%dです。\n", num5);

    return 0;
}

出力結果

複合代入演算子の計算結果

C言語の演算子の優先順位とは?演算子の優先順位一覧

「num = 20 + 4 / 2」という計算があった時は、先に「4 / 2」の計算が行われます。
次に「20 + 2」の計算が行われ、最後にnumに代入されます。

 このように演算子には計算の優先順位があります。

以下に表は演算子の優先順位を一覧化したものです。確認してみて下さい。

演算子の優先順位

優先順位演算子形式機能結合性
1()x(y)関数の呼び出し
[]x[y]配列の要素
x . yポインタから構造体メンバ参照
->x -> y構造体メンバ参照
++x++後置インクリメント
– –x- –後置デクリメント
2++++x前置インクリメント
– –‒x前置インクリメント
sizeofsizeof x変数等の大きさを取得
&&xメモリアドレス
*xポインタの間接参照
++x符号
-x符号の反転
~~xビット否定
!!x論理否定
3(型名)(x)yキャスト
4x * y乗算
/x / y除算
%x % y剰余算
5+x + y加算
x ‒ y減算
6<< x << y左シフト
>> x >> y右シフト
7x < y左の方が小さい
<=x <= y左が右以下
x > y左の方が大きい
>=x >= y左が右以上
8==x == y等しい
!=x != y等しくない
9&x & yビット積
10^x ^ yビット単位排他的論理和
11|x | yビット和
12&&x && y論理積
13||x || y論理和
14:x y : z条件演算子
15=x = y代入
+=x += y加算代入
-=x -= y減算代入
*=x *= y乗算代入
/=x /= y除算代入
%=x %= y剰余代入
<<=x <<= y左シフト代入
>>=x >>= y右シフト代入
&=x &= yビット積代入
|=x |= yビット和代入
^=x ^= yビット単位排他的論理和代入
16,x , yカンマ
表:演算子の優先順位

型変換(キャスト)とは

型変換とは、データ型を変更することを言います。

例えば、int型をdouble型に変換することを型変換やキャストと言います。

この型変換には2種類あり、「暗黙的な型変換」と「明示的な型変換」があります。
まずは、暗黙的な型変換から見ていきましょう。

暗黙的な型変換とは

暗黙的な型変換とは、自動的に行われる型変換のことです。

#include <stdio.h>

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

    printf("aの値は%dです。\n", a);
    printf("bの値は%fです。\n", b);

    return 0;
}

出力結果

aの値は5です。 bの値は5.000000です。

int aには、5.5から0.5が切り捨てられ、5が代入されます。
float bには、5が5.0になり代入されます。

この様に代入の際には、左辺の型に変換されます。

#include <stdio.h>

int main(void)
{
    int a = 2;
    float b = 5.0;
    float result;

    //式中での型変換
    result = a + b;

    printf("resultの値は%fです。\n", result);

    return 0;
}

出力結果

resultの値は7.000000です。

この様に、式中にint型とfloat型がある場合、int型である変数aは計算時にfloat型へと変換されています。変換される型には優先順位があります。

型の優先順位
  • double型 > float型 > long (int)型 > int型 > short (int)型 > char型
#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 4;
    float result;

    result = a / b;

    printf("resultの値は%fです。\n", result);

    return 0;
}

出力結果

resultの値は2.000000です。

この場合は、resultに2.5が代入される気がしますが、整数同士の割り算の結果は小数点以下は切り捨てられるため2.0が代入されます

明示的な型変換とは

明示的な型変換とは、意図的に型変換することを言います。

#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 4;
    float result;

    result = a / (float)b;

    printf("resultの値は%fです。\n", result);

    return 0;
}

出力結果

resultの値は2.500000です。

(float)bで明示的にfloat型へ型変換を行なっています。
暗黙的な型変換の時は、resultの値は2でしたが、明示的に型変換をすることで、resultの値は2.5になります。

キーボードから数値や文字を入力する方法

キーボードから数値や文字を入力する方法
  • scanf(“変換指定子”, &変数名);
#include <stdio.h>

//これは気にしないでください
void clearInputBuffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

int main(void)
{
    int a;
    float b;
    char c;

    printf("整数を入力して下さい。\n");
    scanf("%d", &a);
    clearInputBuffer();

    printf("小数を入力して下さい。\n");
    scanf("%f", &b);
    clearInputBuffer();

    printf("文字を入力して下さい。\n");
    c = getchar();
    clearInputBuffer();

    printf("a=%d b=%f c=%c\n", a, b, c);

    printf("整数と小数を入力して下さい。\n");
    scanf("%d%f", &a, &b);
    clearInputBuffer();

    printf("a=%d b=%f\n", a, b);

    return 0;
}

出力結果

整数を入力して下さい。 5 小数を入力して下さい。 2.4 文字を入力して下さい。 a a=5 b=2.400000 c=a 整数と小数を入力して下さい。 8 2.2 a=8 b=2.200000

キーボード入力にはscanf関数を使用します。

scanf(“%d”, &a);
この様に、左には変換指定子を置き、右には&(アンパサンド)の後ろに変数名を置く必要があります。

c = getchar();
文字入力にはgetchar関数を使用することができます。

scanf(“%d%f”, &a, &b)
この様に書くことで、連続しての入力も可能です。

以下のソースコードは気にしないでください。関数を使っているのですが、関数は8章で解説します。簡単な説明だけします。

void clearInputBuffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

clearInputBuffer();

scanfを使うと、入力で発生したデータが一時的にバッファという領域に保存されます。バッファにデータが残っていると予期せぬ動作が発生する可能性があるので、バッファ内のデータをクリアしています。


練習問題

加算で7を求め、変数に代入し、コンソールに表示しましょう

#include <stdio.h>
int main()
{
    // 問1
    int num_a;
    num_a = 3 + 4;
    printf("%d\n", num_a);

    return 0;
}

出力結果

7

減算で3を求め、変数に代入し、コンソールに表示しましょう

#include <stdio.h>
int main()
{
    // 問1
    int num_a;
    num_a = 3 + 4;
    printf("%d\n", num_a);

    // 問2
    int num_b;
    num_b = 7 - 4;
    printf("%d\n", num_b);

    return 0;
}

出力結果

7 3

乗算で10を求め、変数に代入し、コンソールに表示しましょう

#include <stdio.h>
int main()
{
    // 問1
    int num_a;
    num_a = 3 + 4;
    printf("%d\n", num_a);

    // 問2
    int num_b;
    num_b = 7 - 4;
    printf("%d\n", num_b);

    // 問3
    int num_c;
    num_c = 2 * 5;
    printf("%d\n", num_c);

    return 0;
}

出力結果

7 3 10

除算で3.33を求め、変数に代入し、コンソールに表示しましょう

#include <stdio.h>
int main()
{
    // 問1
    int num_a;
    num_a = 3 + 4;
    printf("%d\n", num_a);

    // 問2
    int num_b;
    num_b = 7 - 4;
    printf("%d\n", num_b);

    // 問3
    int num_c;
    num_c = 2 * 5;
    printf("%d\n", num_c);

    // 問4
    double num_d;
    num_d = 10 / 3.0;
    printf("%0.2f\n", num_d);

    return 0;
}

出力結果

7 3 10 3.33

①で7を代入した変数を2で剰余算し、変数に代入し、コンソールに表示しましょう

#include <stdio.h>
int main()
{
    // 問1
    int num_a;
    num_a = 3 + 4;
    printf("%d\n", num_a);

    // 問2
    int num_b;
    num_b = 7 - 4;
    printf("%d\n", num_b);

    // 問3
    int num_c;
    num_c = 2 * 5;
    printf("%d\n", num_c);

    // 問4
    double num_d;
    num_d = 10 / 3.0;
    printf("%0.2f\n", num_d);

    // 問5
    num_a = num_a % 2;
    printf("%d\n", num_a);

    return 0;
}

出力結果

7 3 10 3.33 1

変数numはどのように値が変化するでしょうか?num += 2;から5つ考えましょう。

int num = 7;

num += 2;
num -= 3;
num *= 2;
num /= 4;
num %= 2;

numの値はいくつですか?

int num;

num = 2 * 5 + 3;

13

変数aの値は?resultの値はこの式だと3.0です。型変換(キャスト)をして3.5にして下さい。

#include <stdio.h>
int main()
{
    float result;
    int a = 7.5;
    int b = 2;

    result = a / b;

    printf("%f", result);
}
#include <stdio.h>
int main()
{
    float result;
    int a = 7.5;
    int b = 2;

    result = a / (float)b;

    printf("%f", result);

    return 0;
}

出力結果

3.5

以下、上から順に行ってください

  • 「身長(単位m)を入力して下さい。(例:172cmの場合1.72と入力)」と表示
  • 「体重を入力して下さい。」と表示
  • 入力された2つの値をもとに、BMI(適性体重)を求めて下さい
    ※BMIの求め方は、BMI = 体重 /(身長 * 身長)
  • 「あなたのBMIは(答え)です。」と表示
#include <stdio.h>
int main() {

    double height;
    double weight;
    double bmi;


    printf("身長(単位m)を入力して下さい。(例:172cmの場合1.72と入力)\n");
    scanf("%lf", &height);

    printf("体重を入力してください。\n");
    scanf("%lf", &weight);
    
    bmi = weight / (height * height);
    printf("あなたのBMIは%fです。\n", bmi);

    return 0;
}

出力結果

身長(単位m)を入力して下さい。(例:172cmの場合1.72と入力) 1.56 体重を入力してください。 50 あなたのBMIは20.545694です。

☜前の章へ 変数の使い方(宣言・代入・初期化・型・出力)
☞次の章へ 条件分岐をしてみよう