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言語で足し算を行う際、初心者がよく直面するエラーには、以下のようなものがあります。
- ユーザー入力時のエラー(
scanf
のミス) - オーバーフロー(変数の値が範囲を超える)
- データ型の不一致(整数と小数の計算ミス)
このセクションでは、これらのエラーの原因と対策を詳しく解説します。
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言語では、整数型(int
や long
)には格納できる値の上限と下限 があります。
もし 最大値を超える計算を行うと、予期しない動作(オーバーフロー) が発生します。
#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
)と浮動小数点型(float
や double
)を混在して計算すると、型変換の影響で意図しない結果になることがあります。
#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
) だけでなく、小数 (float
や double
) を扱うことができます。
しかし、小数の足し算では、誤差が発生することがある ため、注意が必要です。
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言語の float
や double
は、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. ++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
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. データ型の選び方
データ型 | ビット数 | 格納できる範囲 |
---|---|---|
int | 32bit | -2,147,483,648 ~ 2,147,483,647 |
long | 32bit または 64bit | 環境による |
long long | 64bit | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
float | 32bit | 約 ±3.4×10³⁸ |
double | 64bit | 約 ±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
対策
long long
型を使う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