首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言入門必修課:兩數求和與加法運算律深度解析

     編輯:關於C語言

C語言入門必修課:兩數求和與加法運算律深度解析

「兩數求和」是所有編程語言的 Hello World 級練習。本文從最基礎的輸入輸出模板,延伸至加法交換律/結合律的數學本質、C 語言自增自減運算符前後綴陷阱、斷言驗證技術,構建扎實的數值計算認知體系。

最基礎的 A+B 問題標準解

#include <stdio.h>

int main() {
    int a, b;
    // 多組測試數據讀取直到 EOF
    while (scanf("%d %d", &a, &b) == 2) {
        printf("%d\n", a + b);
    }
    return 0;
}

工程化細節:

  • scanf 返回成功讀取的項數,== 2 確保兩個整數均讀取成功
  • while 循環天然支持多組測試數據(OJ 常見要求)
  • 輸入樣例 2000 9 → 輸出 2009,驗證大數加法無溢出(int 32 位足夠)

數學本質:加法交換律與結合律

律名數學表達程序驗證代碼片段編程意義
交換律a + b = b + aassert(a + b == b + a);運算順序不影響結果,優化編譯器可重排指令
結合律(a + b) + c = a + (b + c)assert((a + b) + c == a + (b + c));分組方式不影響結果,但浮點數因精度可能不成立!

關鍵警示: 浮點數加法不滿足結合律(如 (1e20 + -1e20) + 1 = 1 但 1e20 + (-1e20 + 1) = 0),財務/科學計算必須用定點數或專用庫。

C 語言特有陷阱:自增自減前後綴差異

使用 assert 進行編碼期驗證(需 #include <assert.h>):

int main() {
    int a;
    
    // 前綴 ++a:先增後用
    a = 5; assert(++a == 6);  // a 變 6,表達式值 6
    
    // 後綴 a++:先用後增
    a = 5; assert(a++ == 5);  // 表達式值 5,a 隨後變 6
    assert(a == 6);
    
    // 前綴 --a:先減後用
    a = 5; assert(--a == 4);
    
    // 後綴 a--:先用後減
    a = 5; assert(a-- == 5);
    assert(a == 4);
    
    return 0;
}

取模運算(%)適用性邊界

  • 僅適用於整數類型:int、long、short 等
  • 浮點數取模:需用 fmod()(math.h)或 remainder()
  • 負數取模規則:C99 規定 (a/b)*b + a%b == a,商向零截斷,餘數符號同被除數

進階驗證技巧:靜態斷言

C11 _Static_assert 編譯期檢查(不產生運行時代碼):

_Static_assert(sizeof(int) >= 4, "int must be at least 32 bits");
_Static_assert(INT_MAX >= 32767, "INT_MAX too small");

常見錯誤總結表

錯誤代碼現象原因修正
scanf("%d", a)崩潰/輸出亂碼缺少取地址符 &scanf("%d", &a)
printf("%d", a+b)格式化錯誤缺少換行或格式符不匹配printf("%d\n", a+b)
int c = a+++b;編譯歧義解析為 (a++) + b加空格 a++ + b 或括號
浮點數直接 == 比較邏輯錯誤精度誤差用 fabs(a-b) < EPS

從簡單的 A+B 出發,觸類旁通至數學運算律、運算符優先級、斷言防禦性編程、浮點數陷阱,這正是「以簡馭繁」的編程內功心法。建議將斷言驗證納入日常編碼習慣,讓錯誤在編譯期或測試期暴露,而非生產環境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved