测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
B75

程序调试:断点、单步与质数案例

引入

章前总览 调试(debug)是为了抓住逻辑错误:一步步跑程序、看变量。也常用来读懂别人的写法。

本节内容:

  • 何时需要调试
  • 断点与单步的通用步骤
  • 案例:质数判定里的同名变量陷阱
  • 小知识:bug 与 debug

1 调试目的与步骤

样例跑不通、输出错、或提交 WA/RTE/TLE 时,都可以调试。

通用四步(各 IDE 类似)

  • 设断点:执行到该行暂停;若断点前有 cin,会先等你输入。
  • 进入调试状态(如 Dev-C++ 的 F5)。
  • 单步执行,对照预期步骤;在监视窗口看变量。
  • 遇函数调用:可步过整函数,或步入函数内部再返回。

2 案例:有逻辑错误的质数判定

输入 n≥2,质数输出 yes,否则 no。下面程序能编译,但输入 13 会错成 no。

</> 有 bug 的代码

#include <iostream>
using namespace std;

int main() {
    int n; cin >> n;
    int i = 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0)
            break;
    }
    if (i * i <= n) cout << "no" << endl;
    else cout << "yes" << endl;
    return 0;
}
  • 测试:12 → no(对);13 → no(错,应为 yes)。

根因:两个叫 i 的变量

  • for 里的 int i 作用域仅限循环内。
  • 循环后判断用的是外面那个 i(一直是 0)。
  • 0*0≤13 恒真 → 总输出 no。
  • 修复:去掉 for 里的 int,只用外层 i,在 for 头里初始化。

</> 修好后

int i = 0;
for (i = 2; i * i <= n; i++) {
    if (n % i == 0) break;
}
if (i * i <= n) cout << "no" << endl;
else cout << "yes" << endl;

3 小知识:bug 与 debug

bug 原指虫子;早期计算机因虫子钻进真空管而失灵,后人用 bug 称呼隐藏缺陷。

注意

  • bug 一般指逻辑错误:能运行,但特定情况结果错甚至崩溃。
  • 编译错误不算 bug——程序根本跑不起来。
  • 发现并修好的过程叫 debug(调试)
  • 例:if(a=1) 本意相等却写成赋值,就是典型 bug。
小结

调试时盯紧:

断点 → 输入 → 单步 → 看变量
同名变量 / 作用域 是一级常见坑
里程碑达成:

下一节做第15章基础知识自测。