目次
1. 前言
C語的加法是什麼?為初學者解說【從基礎到應用】
C語言中,加法是最基本的運算之一。「+」運算子可以用來對數值進行加總,但根據資料型別和輸入方式,行為可能會有所不同。 C語言剛開始學習的人當中,有- 「不懂 C 語言的加法寫法」
- 「想了解如何使用變數進行計算」
- 「想製作將多個數值合計的程式」 等疑問的也很多。
2. C語的加法寫法【給初學者的完整指南】
C語的「+」運算子基礎
C語的加法使用算術運算子「+」。這是將兩個數值相加的基本運算子。整數的加法
#include <stdio.h>
int main(void) {
int a = 10, b = 5;
int sum = a + b;
printf("總計: %dn", 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("總計: %dn", sum);
return 0;
}
執行結果總計: -2
此外,包含零的加法也會照常運作。int a = 10;
int sum = a + 0; // 結果是 10
即使不進行特別處理,C 語的加法也 能夠處理負數與零的計算。3. 使用變數與使用者輸入的加法
使用 C 語言變數的加法【scanf 的活用】
C 語言中,可以接受使用者的輸入並進行計算。為此,使用標準輸入函式scanf
。 以下程式會讓使用者輸入兩個數值,並將它們相加。#include <stdio.h>
int main(void) {
int num1, num2, sum;
printf("請輸入第一個整數:");
scanf("%d", &num1);
printf("請輸入第二個整數:");
scanf("%d", &num2);
sum = num1 + num2;
printf("總和: %dn", sum);
return 0;
}
執行結果範例請輸入第一個整數:7
請輸入第二個整數:3
總和: 10
避免輸入錯誤的方法
scanf
使用時,考慮輸入錯誤是很重要的。例如,使用者輸入非數字的文字時,程式可能會產生未預期的行為。 為了防止此問題,可以檢查 scanf
的返回值,以確認是否正確輸入。#include <stdio.h>
int main(void) {
int num;
printf("請輸入整數:");
if (scanf("%d", &num) != 1) {
printf("輸入錯誤:請輸入整數。n");
return 1; // 回傳錯誤代碼並結束
}
printf("輸入的整數:%dn", 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("輸入的整數:%dn", 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("輸入的整數:%dn", 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("輸入的整數:%dn", 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("輸入的整數:%dn", 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("總和:%dn", 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("總和:%lldn", 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("總和:%dn", sum);
return 0;
}
執行結果總和:7
對策:統一資料型別
#include <stdio.h>
int main(void) {
double a = 5.0;
double b = 2.5;
double sum = a + b; // 使用 double 計算
printf("總和:%.2fn", 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("總計: %.2fn", 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("總計: %.17fn", sum);
return 0;
}
執行結果總計: 0.30000000000000004
原因:浮點數內部表示所導致的誤差
C 語言的float
與 double
以二進位表示小數,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("總計: %.2fn", sum);
return 0;
}
② 轉換為整數後計算
#include <stdio.h>
int main(void) {
int a = 10, b = 20; // 將小數轉換為整數(乘以100)
int sum = a + b;
printf("總計: %.2fn", 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("總計: %.20Lfn", 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("總和: %dn", 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("總和: %dn", sum);
return 0;
}
執行結果請輸入數值(輸入 0 結束): 5
10
3
0
總和: 18
6-3. 使用 do-while
迴圈的數值合計
do-while
迴圈具有、至少執行一次的特性 這樣的特點。#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("總和: %dn", 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("總計: %dn", sum);
return 0;
}
執行結果總計: 15
7-2. +=
運算子(累積加法)
#include <stdio.h>
int main(void) {
int num = 10;
num += 5; // num = num + 5 與相同
printf("結果: %dn", num);
return 0;
}
執行結果結果: 15
7-3. ++
運算子(遞增)
#include <stdio.h>
int main(void) {
int num = 5;
num++; // num = num + 1 與相同
printf("遞增後的值: %dn", 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=%dn", a, b);
a =5; // 重設
c = a++; // 後置遞增
printf("後置: a=%d, c=%dn", 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("總計: %dn", 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("總計: %lldn", 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("總計: %.10fn", 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 的最大值: %un", UINT_MAX);
printf("unsigned long long 的最大值: %llun", 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] = '�';
int len = k;
for (i = 0; i < len; i++) {
result[i] = temp[len - 1 - i];
}
result[len] = '�';
}
int main(void) {
char num1[MAX], num2[MAX], result[MAX];
printf("請輸入第一個大數值: ");
scanf("%s", num1);
printf("請輸入第二個大數值: ");
scanf("%s", num2);
addLargeNumbers(num1, num2, result);
printf("總和: %sn", result);
return 0;
}
執行結果請輸入第一個大數值: 987654321987654321987654321
請輸入第二個大數值: 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("總和: %dn", 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("總和: %dn", 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=%dn", a, b);
a = 5; // 重設
c = a++; // 後置遞增
printf("後置: a=%d, c=%dn", a, c);
return 0;
}
執行結果前置: a=6, b=6
後置: a=6, c=5