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

2.7 调试程序
程序的错误通常叫作bug,找出并修正错误的过程叫作调试(debug)。
/*  nogood.c -- a program with errors */
#include <stdio.h>
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 <stdio.h>
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)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。调试器有不同的使用难度和复杂度。如果你的编译器自带调试器,现在可以花点时间学会怎么使用它。 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值