作為 Java 開發者轉戰 C++,近期整理了實戰中踩過的坑,涵蓋浮點數行為、格式化輸出、輸入讀取、字符串操作、類型轉換等核心知識點,供初學者避坑參考。
系統最大 float 約 3.4E38。乘以 100 導致上溢,printf 輸出 inf;極小數除以 10 導致精度丟失,稱為下溢。此外,asin(x) 在 |x| > 1 時返回 NaN。
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 位變化超出精度範圍。
%d 輸出 float 產生垃圾值%d 期望 int,傳入 float 會按整數方式解讀浮點數的二進制位模式,結果不可預期。
scanf("%s") 僅讀取單詞輸入 "Tony KK" 時,%s 僅讀取 "Tony",空格後內容留在緩衝區。需用 gets() 或 fgets() 讀整行。
strlen() 與 sizeof() 差異sizeof(arr):數組總字節數(含結束符 \0)。strlen(str):字符串實際長度(不含 \0)。sizeof("abc") == 4,strlen("abc") == 3。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 位,超範圍值截取低位。
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,避免隱式截斷。