C语言实验指导及习题解析
上QQ阅读APP看书,第一时间看更新

1.3 程序调试方法介绍

程序编译、连接通过,即可执行,这说明程序无语法错误,但不能确定程序执行的结果是否正确。若程序执行结果与要求不符,则说明程序存在算法上的问题,这类错误称为逻辑错误。

逻辑错误的判断、定位、修改,往往要比通过编译检查语法错误困难得多,不仅依赖于程序设计者对算法的理解以及编程经验,还需借助于必要的手段,这一点对于初学者显得尤为重要。C语言环境都或多或少地提供了必要的调试工具,在此简单介绍几种常用的调试方法和手段。

1.添加输出语句

输出语句的作用是输出程序的最终结果,中间的执行结果是不必输出的,但是在程序的调试过程中,输出一些中间结果对于错误的判断是十分有益的。因此可以在程序执行的中间增加一些输出语句,以检测程序执行过程中的问题,这也是调试的重要手段。下面通过例题,说明输出语句的使用方法。

例如:求1~10之间的所有偶数之和。程序代码如下:

在VC++ 6.0环境下,输入源程序,编译连接无语法错误,经执行后其结果如图1-13所示。

图1-13 运行结果

从运行结果中可以看出,虽然程序没有语法错误,但执行结果明显是错误的。到底哪里出现了错误,为了定位错误,可以在循环的累加过程中加入输出语句,输出每次累加前变量sum的值,则可将代码改为:

执行结果如图1-14所示。

图1-14 添加输出语句后的执行结果

可见,在循环中sum的值按i的变化递增,已经进行累加。但第一次累加之前sum的值是-858993460而不是0,这就意味着产生错误的原因是在循环之前,没有为sum赋初值0。因此,将sum=0;语句加在for循环前,然后删除掉增加的输出语句。再次编译、执行程序,结果如图1-15所示,正确无误。

图1-15 输入正确结果

最终的程序代码如下:

2.单步执行

单步执行是编程环境常备的一种调试工具,它是让程序一步一步地执行,观察执行结果是否符合要求。

(1)进入单步执行状态。按【F11】(选择“编译”→“开始调试”→“Step Into”命令)或【F10】键进入单步执行状态,如图1-16所示。

图1-16 单步运行界面

(2)单步执行。

①单步执行状态。正中间的是正在调试的源程序代码窗口,左侧的黄色箭头(称为当前行指针),指示将要执行但尚未执行的语句行。以后,每按一次【F10】或【F11】键,程序就执行一步,黄色箭头也相应移到下一行的行首,下一行就变成当前行。下一行指的是下一步将要执行的语句行。如果一行中含有多条语句,那么按一次单步执行键【F10】或【F11】,便执行完本行上的所有语句,并使下一行变为当前行。反之,如果一条语句占多行,那么,按一次单步执行键,就把整条语句执行完。为了便于调试,最好一行只写一条语句,而不要写多条语句。

注意:【F10】键的作用是单步执行一条语句,单步执行时函数仅被作为一条语句执行但是不进入所调用的函数,这叫“step over”——单步越过,而【F11】键的作用是进入调用的函数中单步执行,这叫“step into”——单步进入,一般用在程序中有自定义函数的情况。

②变量窗口和观察窗口。左下方窗格为变量窗口,选择“Auto”选项卡,则显示与当前正在执行的语句有关的变量名及其当前值;若切换到“Locals”选项卡,则显示当前函数内所有变量名及其当前值。每按一次单步执行键,该窗口中显示的内容都可能随之改变,且以红色显示。

右下方窗格为观察窗口,用于“自由”观察某些变量当前值的变化情况。可以在“Watch1”至“Watch4”选项卡的“Name”栏中填入想观察的变量名、表达式,在“Value”栏便可看到其值。而单击“Name”栏中变量名或表达式,然后按【Delete】键,即可取消对该变量的观察,该变量名即从“Watch”窗口中消失。也可手工修改“Value”栏中的值。比如在“Name”栏中输入变量“sum”,当第一次单步调试到sum=sum+i;后,可以看到sum的值是-858993460,将sum值改为2,如图1-17所示,再继续调试下面的语句。当然,这种情况下,程序的“错误”并未得到改正。

图1-17 修改sum值

3.设置断点

如果只对程序中的某一段代码进行调试,而对于在它之前的那些代码段不感兴趣,此时就可以设置断点了。在程序中设置若干个断点,就可以使程序一段一段地执行。每当执行到一个断点处,程序便停下来,用户可以像单步执行那样检查运行结果。这比单步执行要快得多,提高了调试速度。如果事先能够估计出某段程序有错(或没错),用断点法调试程序,效率会更高。

将光标移到编辑区某语句行,按【F9】键,或单击工具栏中的“Insert/Remove Breakpoint”按钮,本行就成为一个断点,行首出现的紫红色圆点为断点标记。如果设置多个断点,每个断点的行首都将有一个紫红色断点指示标记,如图1-18所示。

将光标移到编辑区已经设置了断点的语句行,按【F9】键,或单击工具栏中的“Insert/确Remove Breakpoint”按钮,行首紫红色圆点消失,即取消了该断点。

设置了断点后,按【F5】键,或单击工具栏中的“Go”按钮,程序开始执行。遇到断点时,程序暂停执行(注意,此时断点处的语句尚未执行),该断点的紫红色圆圈内出现一个黄色的指示箭头(当前断点指针)。接着根据需要交替地按【F5】【F10】【F11】键,穿插地采用单步执行法或执行到断点的方法,对程序进行调试。而任何时刻也都可以按【Shift+F5】组合键或选择“Debug”→“Stop Debugging”命令,返回到编辑环境。

图1-18 设置断点