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

C++ 基礎易錯點深度解析:從浮點陷阱到輸入輸出細節

     編輯:關於C++

前言

作為 Java 開發者轉戰 C++,近期整理了實戰中踩過的坑,涵蓋浮點數行為、格式化輸出、輸入讀取、字符串操作、類型轉換等核心知識點,供初學者避坑參考。

1. 浮點數上溢與下溢

系統最大 float 約 3.4E38。乘以 100 導致上溢,printf 輸出 inf;極小數除以 10 導致精度丟失,稱為下溢。此外,asin(x) 在 |x| > 1 時返回 NaN。

2. 浮點數捨入誤差

float a, b;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
printf("%f\n", a);  // 輸出 0.000000,而非 1.0

原因:float 僅有 6~7 位有效數字,2.0e20 + 1 的第 21 位變化超出精度範圍。

3. %d 輸出 float 產生垃圾值

%d 期望 int,傳入 float 會按整數方式解讀浮點數的二進制位模式,結果不可預期。

4. scanf("%s") 僅讀取單詞

輸入 "Tony KK" 時,%s 僅讀取 "Tony",空格後內容留在緩衝區。需用 gets() 或 fgets() 讀整行。

5. strlen() 與 sizeof() 差異

  • sizeof(arr):數組總字節數(含結束符 \0)。
  • strlen(str):字符串實際長度(不含 \0)。
  • 字符字面量 sizeof("abc") == 4,strlen("abc") == 3。

6. 有符號轉無符號、大值轉 char 等價取模

short num = 336, mnum = -336;
printf("%hd %hu\n", num, num);      // 336 336
printf("%hd %hu\n", mnum, mnum);    // -336 65200  (65536 - 336)
printf("%d %c\n", 336, 336);        // 336 對應 ASCII 碼
printf("%d %hd %c\n", 65618, 65618, 65618); // 截取低 8 位

short 範圍 -32768~32767,負數以補碼存儲;char 通常 8 位,超範圍值截取低位。

7. printf 參數棧讀取機制

float n1 = 3.0; double n2 = 3.0;
long n3 = 2000000000, n4 = 1234567890;
printf("%.1e %.1e %.1e %.1e\n", n1, n2, n3, n4); // 錯誤輸出
printf("%ld %ld\n", n3, n4);                     // 正確
printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);   // 全錯

編譯器按實際類型壓棧(float 提升為 double 佔 8 字節),printf 按格式符讀取,類型不匹配導致棧偏移,產生連錯。

總結

C++ 靈活強大,但細節決定成敗。浮點精度、格式匹配、輸入邊界、類型轉換規則,每一項都是面試高頻考點與實戰隱形坑。建議:

  • 浮點運算優先用 double,比較用 epsilon。
  • 格式化輸出嚴格匹配類型,開啟編譯器警告 -Wformat。
  • 輸入處理首選 std::getline + stringstream。
  • 類型轉換显式使用 static_cast,避免隱式截斷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved