「不會調試,寸步難行。」本文以一個計算直角三角形斜邊的交互程序為例,演示如何**逐行分析代碼意圖、設置斷點、單步執行、觀察變量**,掌握 Visual Studio / GDB 通用的調試思維。
#include <stdio.h>
#include <math.h>
// 自定義函數:計算斜邊
double hypotenuse(double a, double b)
{
return sqrt(a * a + b * b);
}
int main(void)
{
while (1) {
double a, b;
printf("請輸入直角三角形的兩條直角邊長:");
if (scanf("%lf %lf", &a, &b) != 2) { // 輸入失敗處理
printf("輸入格式錯誤,請重試。\n");
while (getchar() != '\n'); // 清空緩衝區
continue;
}
if (a > 0 && b > 0) {
printf("斜邊長為:%.2f\n", hypotenuse(a, b));
} else {
printf("邊長必須為正數,請重新輸入!\n");
}
}
return 0; // 理論上不可達
}
| 行號 | 代碼 | 意圖/目的 |
|---|---|---|
| 1-2 | 頭文件 | 引入標準輸出/輸入、數學庫(sqrt) |
| 5-7 | hypotenuse 函數 | 封裝計算邏輯,便於復用與測試 |
| 10 | while(1) | 無限循環,支持多次計算 |
| 11 | double a,b | 局部變量,存儲用戶輸入 |
| 12 | printf 提示 | 人機交互引導 |
| 13 | scanf 讀取 | 獲取兩個 double,檢查返回值防異常輸入 |
| 14 | 輸入失敗處理 | 清理緩衝區殘留,避免死循環 |
| 16 | if (a>0 && b>0) | 業務邏輯校驗:邊長必須為正 |
| 17 | 調用 hypotenuse | 計算並格式化輸出結果 |
| 19 | else 分支 | 友好錯誤提示 |
scanf 前設置斷點 → 觀察輸入前變量狀態(未初始化)。printf 設置斷點 → 驗證計算結果。while(getchar()) 設置條件斷點(scanf返回值!=2)→ 專門調試異常輸入路徑。a、b 顯示隨機值(未初始化)。scanf → 控制台等待輸入 → 輸入 3 4 → 繼續。a=3, b=4,scanf 返回 2。hypotenuse(a,b) 按 F11 進入函數內部。sqrt 庫函數調用、返回值計算。main,繼續執行 printf。a*a + b*b、sqrt(a*a+b*b) 實時顯示中間值。a < 0 || b < 0 只在非法輸入時停下。rip/eip 指令指針流向。double 在內存中 IEEE-754 佈局。| 技巧 | 操作 | 適用場景 |
|---|---|---|
| 條件斷點 | 右鍵斷點 → Condition | 僅在特定變量值停下 |
| 命中計數 | Hit Count → N | 循環第 N 次迭代停下 |
| 數據斷點 | 監視內存地址讀寫 | 查找誰修改了全局變量 |
| 調用棧 | Call Stack 窗口 | 回溯函數調用鏈 |
| 即時運算 | Immediate Window / Debug Console | 運行任意表達式、調用函數 |
printf/syslog 照樣能贏。通過一個簡單的勾股定理程序,我們完整走了一遍「斷點 → 單步 → 步入/步出 → 觀察變量 → 條件斷點」的標準調試流程。熟練掌握這套操作,配合良好的代碼閱讀習慣,將讓你從「靠運氣編程」進化為「可控交付」。