本文共 1868 字,大约阅读时间需要 6 分钟。
实验内容:1、 用VC6.0调试执行一个C程序
2、 观察一个C函数被调用时的执行情况
实验目的及要求:
1、 掌握用VC6.0调试执行一个C程序的方法
2、 初步理解一个C函数的执行过程
实验重点:
1、 掌握“断点”、“调试执行”、“单步执行”等概念
2、 分析函数的执行过程
3、 在程序调试执行时输入数据,观察输出
实验难点:
1、 区分调试执行时快捷键F10和F11的异同
2、 理解被调用函数的执行过程
实验步骤:
1、打开VC6.0,创建一个名为1_4的工程,在编辑器窗口输入如下程序。
程序1-4:有两个函数的C程序
程序1-4有两个函数,sum函数的定义从第2行至第7行,main函数的定义从第8行至第15行。C程序的执行过程就是执行main函数的过程,下面利用VC6.0的调试功能查看一下程序1-4的执行过程。
2、把光标定位在第11行,单击编译工具栏上的手型图标(或按下快捷键F9),插入断点,如图1所示。
图1 程序1-4中插入断点
3、选择【组建(Build)】|【开始调试(Debug)】|【Go】命令(或按下快捷键F5),进入调试模式,如图2所示。在调试模式,程序执行到断点位置的语句时会自动停下,此时可以观察程序当前的状态如变量的值。
图2 用调试模式执行程序1-4
在调试模式下可以利用调试命令控制程序的执行,如此时可单步执行程序,即每次只执行一条语句,执行完一条语句后程序自动暂停执行。单步执行程序可以方便地查看程序执行的细节。
4、单击调试工具栏上的是单步执行命令(或按下快捷键F11),执行完第11行语句后程序再次暂停,如图3所示。
图3 单步执行
5、再次按下快捷键F11,并观察程序状态的变化。当执行到第13条语句时,sum函数被调用,程序开始进入并执行sum函数,如图4所示。
图4 开始执行sum函数
6、继续按下快捷键F11,执行完被调用的sum函数并返回到main函数后,如图5所示。
图5 执行完被调用函数后返回到调用函数
接下来要执行的第14条语句是printf函数调用,如果按下快捷键F11,那么程序将用调试模式执行printf函数。没有必要调试执行库函数,因此,此时按下快捷键F10 。
F10与F11的作用稍有不同。如果当前的执行语句中有函数调用,则用F10时不会单步执行(即调试执行)被调用函数,而是正常执行被调用函数(即连续执行被调用函数中的全部语句)。如果当前的执行语句中没有函数调用,则F10与F11作用相同。
通过调试执行可知,程序1-4的执行顺序是:11、12、13、3、5、6、7、13、14、15,其中在第3、7、15行处暂停执行程序的目的是方便查看当时的程序状态。
思考:
1)使用函数(调用函数)究竟意味着什么?
//执行了函数体中的代码
2)如何与被调用函数传递数据?(怎样向函数中传入数据,函数怎样传出数据,怎样接收从函数传出的数据?)
//可以把函数的返回值看作是被调用函数的最终结果。printf("%d", sum(3,2)*6);的输出是?
3)使用函数时应注意什么?
//区分函数有无返回值。有返回值时……无返回值时……
//printf函数有返回值吗?
//实验1-2探究2中的例子里它的返回值是多少?(最终的输出是“叠加”的效果)
7、分析实验1-1中思考:输入两个小数时(比如输入2.3 3.2时),程序的运行结果如图所示。
1)在程序中的第5行设置断点。如图6所示。
图6 在程序设置断点
2)调试执行程序。如图7所示。
图7 调试执行程序
3)无需单步执行库函数printf,因此使用F10调试执行程序。如图8所示。
图8 无需单步执行库函数printf
注意观察VC6.0的变化和程序运行窗口的变化。
4)无需单步执行库函数scanf,因此使用F10调试执行程序。如图9所示。
图9 无需单步执行库函数scanf
5)在程序运行窗口输入2.3 3.2↙,然后转回调试窗口。如图10所示。
图10 观察分析程序的运行情况
分析观察可知程序出错的原因了。格式字符串%d只能用于整数的输入,当用户输入小数时(如2.3),scanf函数会将其整数部分做为输入值,但此后该函数将不再处理用户后面的输入数据,因此程序中变量b没有获得新值。这里需注意,当定义一个变量时,应该认为其值为“随机数”。不过为了便于识别没有为变量赋值的情况,VC6.0会自动为其赋一个特殊值,如整型变量赋值为-858993460。
现在就知道为何程序有如下输出了:
转载地址:http://cbdti.baihongyu.com/