C言語の足し算を完全解説! 基本の使い方から応用・エラー対策まで

目次

1. はじめに

C言語の足し算とは?初心者向けに解説【基本から応用まで】

C言語では、足し算は最も基本的な演算の一つです。「+」演算子を使用して数値を加算することができますが、データ型や入力方法によって動作が異なることがあります。

C言語を学び始めた方の中には、

  • 「C言語の足し算の書き方がわからない」
  • 「変数を使って計算する方法を知りたい」
  • 「複数の数値を合計するプログラムを作りたい」
    といった疑問を持つ方も多いでしょう。

本記事では、C言語の足し算の基礎から応用まで、初心者にもわかりやすく解説します。
すぐにコード例を確認したい方は、次の章「2. C言語の足し算の書き方【初心者向け完全ガイド】」をご覧ください。

2. C言語の足し算の書き方【初心者向け完全ガイド】

C言語の「+」演算子の基本

C言語の足し算は、算術演算子「+」を使用します。これは、2つの数値を加算する基本的な演算子です。

整数の足し算

#include <stdio.h>

int main(void) {
    int a = 10, b = 5;
    int sum = a + b;
    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: 15

「+=」を使った累積計算

C言語には、「+」演算子の短縮記法として 「+=」演算子 があります。
これは、現在の変数の値に別の数値を加算する際に使用できます。

int a = 5;
a += 3; // aは8になる

上記のコードは、以下のように書くのと同じ意味になります。

int a = 5;
a = a + 3; // aに3を加算

+= を使用すると、コードの可読性が向上し、簡潔に記述できます。

負の数や0を含む足し算の動作

C言語では、負の数やゼロを含む足し算も問題なく計算できます。

#include <stdio.h>

int main(void) {
    int a = -5, b = 3;
    int sum = a + b;
    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: -2

また、ゼロを含む足し算も通常通り動作します。

int a = 10;
int sum = a + 0; // 結果は10

特別な処理を行わなくても、C言語の足し算では 負の数やゼロを含む計算が可能 です。

侍エンジニア塾

3. 変数とユーザー入力を用いた足し算

C言語の変数を使った足し算【scanfの活用】

C言語では、ユーザーから入力を受け取って計算を行うことができます。
これには、標準入力関数 scanf を使用します。

以下のプログラムは、ユーザーに2つの数値を入力させ、それらを足し算するものです。

#include <stdio.h>

int main(void) {
    int num1, num2, sum;
    printf("1つ目の整数を入力してください: ");
    scanf("%d", &num1);
    printf("2つ目の整数を入力してください: ");
    scanf("%d", &num2);
    sum = num1 + num2;
    printf("合計: %d\n", sum);
    return 0;
}

実行結果の例

1つ目の整数を入力してください: 7
2つ目の整数を入力してください: 3
合計: 10

入力エラーの回避方法

scanf を使う際には、入力エラーを考慮することが重要 です。
例えば、ユーザーが数字ではなく文字を入力した場合、プログラムが予期しない動作をすることがあります。

この問題を防ぐには、scanf の戻り値をチェック して、正しく入力されたかどうかを確認する方法があります。

#include <stdio.h>

int main(void) {
    int num;
    printf("整数を入力してください: ");

    if (scanf("%d", &num) != 1) {
        printf("入力エラー: 整数を入力してください。\n");
        return 1; // エラーコードを返して終了
    }

    printf("入力された整数: %d\n", num);
    return 0;
}

このプログラムでは、scanf の戻り値をチェックし、整数が入力されなかった場合にエラーメッセージを表示して終了します。

while ループを使った再入力処理

ユーザーが間違った入力をした場合に、再入力を促す仕組み を追加するとより安全なプログラムになります。

#include <stdio.h>

int main(void) {
    int num;
    while (1) { // 無限ループで入力を求める
        printf("整数を入力してください: ");
        if (scanf("%d", &num) == 1) {
            break; // 正しく入力された場合、ループを抜ける
        } else {
            printf("エラー: 整数を入力してください。\n");
            while (getchar() != '\n'); // バッファをクリア
        }
    }

    printf("入力された整数: %d\n", num);
    return 0;
}

この方法では、間違った入力をしてもプログラムが終了せず、正しい値を入力するまで繰り返し要求する ため、ユーザーフレンドリーな作りになっています。

4. C言語の足し算でよくあるエラー3選と対処法【初心者向け】

C言語で足し算を行う際、初心者がよく直面するエラーには、以下のようなものがあります。

  1. ユーザー入力時のエラー(scanf のミス)
  2. オーバーフロー(変数の値が範囲を超える)
  3. データ型の不一致(整数と小数の計算ミス)

このセクションでは、これらのエラーの原因と対策を詳しく解説します。

4-1. scanf の入力エラーを防ぐ方法

エラーの原因

scanf を使用してユーザーからの入力を受け取る際、予期しないデータ(文字列など)が入力されるとプログラムが異常終了する可能性 があります。

#include <stdio.h>

int main(void) {
    int num;
    printf("整数を入力してください: ");
    scanf("%d", &num); // 数値以外を入力すると動作が不安定になる
    printf("入力された整数: %d\n", num);
    return 0;
}

想定外の入力例

整数を入力してください: abc
(プログラムが予期せぬ動作をする)

対策1: scanf の戻り値をチェック

#include <stdio.h>

int main(void) {
    int num;
    printf("整数を入力してください: ");

    if (scanf("%d", &num) != 1) {
        printf("入力エラー: 整数を入力してください。\n");
        return 1; // エラーコードを返して終了
    }

    printf("入力された整数: %d\n", num);
    return 0;
}

対策2: while ループを使った再入力処理

#include <stdio.h>

int main(void) {
    int num;
    while (1) { // 無限ループで入力を求める
        printf("整数を入力してください: ");
        if (scanf("%d", &num) == 1) {
            break; // 正しく入力された場合、ループを抜ける
        } else {
            printf("エラー: 整数を入力してください。\n");
            while (getchar() != '\n'); // バッファをクリア
        }
    }

    printf("入力された整数: %d\n", num);
    return 0;
}

4-2. 足し算で発生するオーバーフローエラー

エラーの原因

C言語では、整数型(intlong)には格納できる値の上限と下限 があります。
もし 最大値を超える計算を行うと、予期しない動作(オーバーフロー) が発生します。

#include <stdio.h>
#include <limits.h> // INT_MAX を使用するために必要

int main(void) {
    int a = INT_MAX, b = 1;
    int sum = a + b; // ここでオーバーフローが発生
    printf("合計: %d\n", sum);
    return 0;
}

対策: long long 型を使用する

#include <stdio.h>
#include <limits.h>

int main(void) {
    long long a = LLONG_MAX, b = 1;
    long long sum = a + b;
    printf("合計: %lld\n", sum);
    return 0;
}

4-3. データ型の不一致による計算ミス

エラーの原因

C言語では、整数型(int)と浮動小数点型(floatdouble)を混在して計算すると、型変換の影響で意図しない結果になることがあります。

#include <stdio.h>

int main(void) {
    int a = 5;
    double b = 2.5;
    int sum = a + b; // int に代入

    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: 7

対策: データ型を統一する

#include <stdio.h>

int main(void) {
    double a = 5.0;
    double b = 2.5;
    double sum = a + b; // double で計算

    printf("合計: %.2f\n", sum);
    return 0;
}

実行結果

合計: 7.50

 

5. 浮動小数点数の足し算と誤差の回避方法

C言語では、整数 (int) だけでなく、小数 (floatdouble) を扱うことができます。
しかし、小数の足し算では、誤差が発生することがある ため、注意が必要です。

5-1. C言語の浮動小数点数の足し算【float / double】

小数を扱う足し算の基本

#include <stdio.h>

int main(void) {
    double a = 1.2, b = 2.3;
    double sum = a + b;
    printf("合計: %.2f\n", sum);
    return 0;
}

実行結果

合計: 3.50

5-2. 「0.1 + 0.2」が0.3にならない問題

以下のプログラムを実行すると、期待した結果が得られない ことがあります。

#include <stdio.h>

int main(void) {
    double a = 0.1, b = 0.2;
    double sum = a + b;
    printf("合計: %.17f\n", sum);
    return 0;
}

実行結果

合計: 0.30000000000000004

原因:浮動小数点数の内部表現による誤差

C言語の floatdouble は、2進数で小数を表現するため、0.1 や 0.2 は正確に表せない ことがあります。

0.1 (10進数) = 0.000110011001100... (2進数)
0.2 (10進数) = 0.00110011001100... (2進数)

このため、0.1 + 0.2 の計算で微小な誤差が発生します。

5-3. 浮動小数点数の誤差を回避する方法

round() 関数で誤差を丸める

#include <stdio.h>
#include <math.h> // round関数を使うために必要

int main(void) {
    double a = 0.1, b = 0.2;
    double sum = round((a + b) * 100) / 100; // 小数第2位まで丸める
    printf("合計: %.2f\n", sum);
    return 0;
}

② 整数に変換して計算する

#include <stdio.h>

int main(void) {
    int a = 10, b = 20; // 小数を整数(100倍)に変換
    int sum = a + b;
    printf("合計: %.2f\n", sum / 100.0); // 元のスケールに戻す
    return 0;
}

long double を使用する

#include <stdio.h>

int main(void) {
    long double a = 0.1L, b = 0.2L;
    long double sum = a + b;
    printf("合計: %.20Lf\n", sum);
    return 0;
}

6. 複数の数値を足す方法(ループの活用)

C言語では、複数の数値を足し算する方法としてループを活用 することが一般的です。
例えば、配列に格納された複数の数値を合計したり、ユーザーから複数の値を入力させて足し算する際にループが役立ちます。

6-1. for ループを使った複数数値の足し算

配列を使って複数の数値を合計する

#include <stdio.h>

int main(void) {
    int numbers[] = {10, 20, 30, 40, 50}; // 5つの数値を配列に格納
    int sum = 0;
    int size = sizeof(numbers) / sizeof(numbers[0]); // 配列の要素数を計算

    for (int i = 0; i < size; i++) {
        sum += numbers[i]; // 配列の各要素を加算
    }

    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: 150

6-2. while ループを使った数値の合計

ユーザー入力を受け付けて、任意の数値を合計

#include <stdio.h>

int main(void) {
    int num, sum = 0;

    printf("数値を入力してください(0を入力すると終了): ");

    while (1) { // 無限ループ
        scanf("%d", &num);
        if (num == 0) {
            break; // 0が入力されたらループを抜ける
        }
        sum += num;
    }

    printf("合計: %d\n", sum);
    return 0;
}

実行結果

数値を入力してください(0を入力すると終了): 5
10
3
0
合計: 18

6-3. do-while ループを使った数値の合計

do-while ループは、最低1回は必ず処理が実行される という特徴があります。

#include <stdio.h>

int main(void) {
    int num, sum = 0;

    printf("数値を入力してください(0を入力すると終了): ");

    do {
        scanf("%d", &num);
        sum += num; // 0が入力された場合も加算されるが、後で修正
    } while (num != 0); // 0が入力されるまで繰り返す

    sum -= num; // 0を引いて補正
    printf("合計: %d\n", sum);
    return 0;
}

実行結果

数値を入力してください(0を入力すると終了): 4
6
2
0
合計: 12

7. 足し算に関する演算子のまとめ

C言語では、足し算を行うための演算子が複数あり、それぞれの用途に応じて使い分けることが重要 です。
このセクションでは、「+」「+=」「++」の違いと活用方法 について詳しく解説します。

7-1. + 演算子(基本の足し算)

#include <stdio.h>

int main(void) {
    int a = 10, b = 5;
    int sum = a + b;
    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: 15

7-2. += 演算子(累積加算)

#include <stdio.h>

int main(void) {
    int num = 10;
    num += 5; // num = num + 5 と同じ
    printf("結果: %d\n", num);
    return 0;
}

実行結果

結果: 15

7-3. ++ 演算子(インクリメント)

#include <stdio.h>

int main(void) {
    int num = 5;

    num++; // num = num + 1 と同じ
    printf("インクリメント後の値: %d\n", num);

    return 0;
}

実行結果

インクリメント後の値: 6

7-4. ++aa++ の違い

#include <stdio.h>

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

    b = ++a; // 前置インクリメント
    printf("前置: a=%d, b=%d\n", a, b);

    a = 5; // リセット
    c = a++; // 後置インクリメント
    printf("後置: a=%d, c=%d\n", a, c);

    return 0;
}

実行結果

前置: a=6, b=6
後置: a=6, c=5

8. C言語の足し算で気をつけること

C言語の足し算は基本的な演算ですが、データ型の制約や計算の特性を理解していないと、予期しないエラーが発生することがあります
このセクションでは、オーバーフローのリスクやデータ型の選び方 について詳しく解説します。

8-1. オーバーフローのリスクとは?

#include <stdio.h>
#include <limits.h> // INT_MAX を使用するために必要

int main(void) {
    int a = INT_MAX, b = 1;
    int sum = a + b; // ここでオーバーフローが発生
    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: -2147483648

8-2. long long 型を使った対策

#include <stdio.h>
#include <limits.h>

int main(void) {
    long long a = LLONG_MAX, b = 1;
    long long sum = a + b;
    printf("合計: %lld\n", sum);
    return 0;
}

8-3. データ型の選び方

データ型ビット数格納できる範囲
int32bit-2,147,483,648 ~ 2,147,483,647
long32bit または 64bit環境による
long long64bit-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float32bit約 ±3.4×10³⁸
double64bit約 ±1.7×10³⁰⁸

8-4. 計算結果の桁あふれ(桁落ち)に注意

#include <stdio.h>

int main(void) {
    double a = 1000000000.0;
    double b = 0.0000001;
    double sum = a + b;

    printf("合計: %.10f\n", sum);
    return 0;
}

実行結果

合計: 1000000000.0000000000

9. 応用編: 大きな数値の足し算

C言語の標準のデータ型 (int, long, long long) では、扱える数値の範囲に限界があります。
しかし、大きな数値(多倍長整数)を扱う必要がある場合 もあります。

9-1. unsigned を使う

#include <stdio.h>
#include <limits.h>

int main(void) {
    printf("unsigned int の最大値: %u\n", UINT_MAX);
    printf("unsigned long long の最大値: %llu\n", ULLONG_MAX);
    return 0;
}

実行結果

unsigned int の最大値: 4294967295
unsigned long long の最大値: 18446744073709551615

9-2. 文字列を使った大きな数値の足し算

#include <stdio.h>
#include <string.h>

#define MAX 1000 // 最大桁数

void addLargeNumbers(char num1[], char num2[], char result[]) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int carry = 0, i, j, k = 0;
    char temp[MAX];

    i = len1 - 1;
    j = len2 - 1;

    while (i >= 0 || j >= 0 || carry) {
        int digit1 = (i >= 0) ? num1[i] - '0' : 0;
        int digit2 = (j >= 0) ? num2[j] - '0' : 0;

        int sum = digit1 + digit2 + carry;
        carry = sum / 10;
        temp[k++] = (sum % 10) + '0';

        i--;
        j--;
    }

    temp[k] = '\0';
    int len = k;
    for (i = 0; i < len; i++) {
        result[i] = temp[len - 1 - i];
    }
    result[len] = '\0';
}

int main(void) {
    char num1[MAX], num2[MAX], result[MAX];

    printf("1つ目の大きな数値を入力: ");
    scanf("%s", num1);
    printf("2つ目の大きな数値を入力: ");
    scanf("%s", num2);

    addLargeNumbers(num1, num2, result);
    printf("合計: %s\n", result);

    return 0;
}

実行結果

1つ目の大きな数値を入力: 987654321987654321987654321
2つ目の大きな数値を入力: 123456789123456789123456789
合計: 1111111111111111111111111110

10. C言語の足し算で初心者がつまずくポイントQ&A

Q1. C言語で複数の数値を効率的に足し算するには?

A1. 配列とループを使うのがベスト!

#include <stdio.h>

int main(void) {
    int numbers[] = {10, 20, 30, 40, 50};
    int sum = 0;
    int size = sizeof(numbers) / sizeof(numbers[0]);

    for (int i = 0; i < size; i++) {
        sum += numbers[i];
    }

    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: 150

Q2. 足し算の結果が予想と違うのはなぜ?

A2. 主な原因は「オーバーフロー」または「型変換ミス」

#include <stdio.h>
#include <limits.h>

int main(void) {
    int a = INT_MAX, b = 1;
    int sum = a + b;
    printf("合計: %d\n", sum);
    return 0;
}

実行結果

合計: -2147483648

対策

  1. long long 型を使う
  2. if (a > INT_MAX - b) でオーバーフローを事前にチェックする

Q3. a++++a の違いは?

#include <stdio.h>

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

    b = ++a; // 前置インクリメント
    printf("前置: a=%d, b=%d\n", a, b);

    a = 5; // リセット
    c = a++; // 後置インクリメント
    printf("後置: a=%d, c=%d\n", a, c);

    return 0;
}

実行結果

前置: a=6, b=6
後置: a=6, c=5