• C Primer Plus(6) 中文版 第2章 C语言概述 2.7 调试程序


    2.7 调试程序
    程序的错误通常叫作bug,找出并修正错误的过程叫作调试(debug)。
    /*  nogood.c -- a program with errors */
    #include
    int main(void)
    (
     int n, int n2, int n3;
     
    /* this program has several errors
     n = 5;
     n2 = n * n;
     n3 = n2 * n2;
     printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3)
     
     return 0;
     ) 
    2.7.1 语法错误
    不遵循C原因的规则就会犯语法错误。C语言的语法错误指的是,把有效的C符号放在错误的地方。
    nogood.c程序中的错误如下:
    其一,main()函数体使用圆括号来代替花括号。这就是把C符号用错了地方。
    其二,变量声明应该这样写:
    int n, n2, n3;
    或者,这样写:
    int n;
    int n2;
    int n3;
    其三,main()中的注释末尾漏掉了*/(另一种修改方案是,用//替换/*)。最后,printf()语句末尾漏掉了分号。
    如何发现程序中的语法错误? 
    首先,在编译之前,浏览源代码看是否能发现一些明显的错误。
    接下来,查看编译器是否发现错误,检查语法错误是它的工作之一。实际上,有时不用把编译器报告的错误逐一修正,仅修正第1条或前几处错误后,错误信息就会少很多。继续这样做,直到编译器不再报错。编译器另一个常见的毛病是,报告错误的位置比真正的错误位置滞后一行。
    2.7.2 语义错误
    语义错误是指意思上的错误。在C语言中,如果遵循了C规则,但是结果不正确,那就是犯了语义错误。
    n3 = n2 * n2;
    此处,n3原意表示n的3次方,但是代码中的n3被设置成n的4次方(n2 = n * n)。
    编译器无法检测语义错误,因为这类错误并未违反C语言的规则。编译器无法了解你的真正意图,所以你只能自己找出这些错误。
    /* stillbad.c -- a program with its syntax errors fixed */
    #include
    int main(void)
    {
        int n, n2, n3;
        
        /* this program has a semantic error */
        n = 5;
        n2 = n * n;
        n3 = n2 * n2;
        printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3);
        
        return 0;
    }

    /* 输出:

     */

    下一步是跟踪程序的执行步骤,找出程序如何得出这个答案。方法之一是,把自己想象成计算机,跟着程序的步骤一步一步地执行。
    检查程序的过程可能过于繁琐。但是,用这种方法一步一步查看程序的执行情况,通常是发现问题所在的良方。
    2.7.3 程序状态
    通过逐步跟踪程序的执行步骤,并记录每个变量,便可监视程序的状态。程序状态(program state)是在程序的执行过程中,某给定点上所有变量值的集合。它是计算机当前状态的一个快照。
    一种跟踪程序状态的方法:自己模拟计算机逐步执行程序。你可以跟踪一小部分循环,看看程序是否按照预期的方式执行。另外,还要考虑一种情况:你很可能按照自己所想去执行程序,而不是根据实际写出来的代码去执行。因此,要尽量忠实于代码来模拟。
    定位语义错误的另一种方法是:在程序中的关键点插入额外的printf()语句,以监视指定变量值的变化。通过查看值的变化可以了解程序的执行情况。对程序的执行满意后,便可删除额外的printf()语句,然后重新编译。 
    检查程序状态的第3种方法是使用调试器。调试器(debugger)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。调试器有不同的使用难度和复杂度。如果你的编译器自带调试器,现在可以花点时间学会怎么使用它。 
     

  • 相关阅读:
    2023年第三届智能制造与自动化前沿国际会议(CFIMA 2023)
    Javaweb之Vue生命周期的详细解析
    JAVA计算机毕业设计学习资源下载管理Mybatis+源码+数据库+lw文档+系统+调试部署
    linux input子系统 — TP A/B(Slot)协议【转】
    关于电影的HTML网页设计—— 电影小黄人6页 HTML+CSS+JavaScript
    JavaScript 中基本数据类型和引用数据类型是如何存储的
    C++中的类、结构体、指针和引用
    后缀自动机(SAM)+广义后缀自动机(GSA)
    PyTorch - Sequential和ModuleList
    算法刷题日志——贪心
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126128803