C語加法徹底解析!從基礎用法到進階與錯誤防護

目次

1. 前言

C語的加法是什麼?為初學者解說【從基礎到應用】

C語言中,加法是最基本的運算之一。「+」運算子可以用來對數值進行加總,但根據資料型別和輸入方式,行為可能會有所不同。 C語言剛開始學習的人當中,有
  • 「不懂 C 語言的加法寫法」
  • 「想了解如何使用變數進行計算」
  • 「想製作將多個數值合計的程式」 等疑問的也很多。
本文將C語言的加法從基礎到應用,為初學者清楚解說。 想立即查看程式碼範例的,請參閱下一章「2. 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 語言進行加法時,初學者常會遇到以下錯誤:
  1. 使用者輸入時的錯誤(scanf 的失誤)
  2. 溢位(變數的值超出範圍)
  3. 資料型別不一致(整數與小數的計算錯誤)
本節將詳細說明這些錯誤的原因與對策。

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 語言中,整數型別(intlong)有可儲存值的上限與下限。如果 進行超過最大值的計算,會發生未預期的行為(溢位)
#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)與浮點型(floatdouble)混合計算,會因型別轉換的影響而產生非預期的結果。
#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),也可以處理小數 (floatdouble)。但是,小數加法可能會產生誤差,因此需要注意。

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 語言的 floatdouble 以二進位表示小數,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. ++aa++ 的差異

#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. 資料型別的選擇方式

資料型別位元數可儲存範圍
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("總計: %.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

對策

  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=%dn", a, b);

    a = 5; // 重設
    c = a++; // 後置遞增
    printf("後置: a=%d, c=%dn", a, c);

    return 0;
}
執行結果
前置: a=6, b=6
後置: a=6, c=5
侍エンジニア塾