1.编程常见的错误
编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求,如果发现错误会产生编译错误。
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
如下图所示:
以下是一些常见的编译型错误:
编译型错误需要在编译前进行修复,通常会在编译器输出错误信息,指示出错的代码行数和具体错误信息,以帮助开发人员进行修复。
编程链接型错误是指在将多个源文件链接成可执行文件时出现的错误。链接器负责将不同源文件中的代码和数据合并在一起,并解决函数和变量的引用关系。
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。
如下图所示:
以下是一些常见的链接型错误:
编程运行时错误是指在程序执行过程中出现的错误,也称为异常。这些错误会导致程序的意外行为或崩溃。
借助调试,逐步定位问题,最难搞。
如下图所示:
这里我们使用函数递归来遍历二叉树时,将递归结束条件屏蔽后,就会出现栈溢出导致程序运行错误
以下是一些常见的运行时错误:
运行时错误通常会导致程序崩溃或产生不可预测的结果。为了解决运行时错误,可以使用调试工具来跟踪错误发生的位置,并检查代码逻辑以发现错误。此外,异常处理机制可以用于捕获和处理运行时错误,使程序在出现错误时能够进行适当的处理,避免程序崩溃。
Debug
通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
我们写代码通常使用debug版本:
Release
称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
首先在环境中选择 debug 选项,才能使代码正常调试。 如下图所示:
最常使用的几个快捷键:
例如,当我们发现使用二叉树前序遍历时程序会异常,经过思考我们发现可能是前序遍历函数出现的问题,就可以在使用前序遍历函数的那一行按下F9创建断点,然后按下F5启动调试,程序直接跳到前序遍历函数这里:
使用F5开始调试:
开始调试后,进入前序遍历函数内部,进行逐语句调试
在调试开始之后,用于观察变量的值。
步骤如下图所示:
使用断点,开始调试到断点位置后,就可以使用F11逐语句调试,然后就可以利用监视查看当前临时变量的值了,如下图所示:
这里我们发现数组还没有初始化,这是因为第79行还没有执行,当我们按下F11进行下一句的时候,数组就会初始化完毕了:
在调试开始之后,用于观察内存信息。
步骤如下图所示:
使用断点,开始调试到断点位置后,就可以使用F11逐语句调试,然后就可以利用内存观察内存信息了,如下图所示:
如果想显示的更清楚一些,可以将显示的列改成4列,让它一行显示4个字节:
对于我们想查看的内存信息,可以在上方地址栏输入我们已知的地址进行查看:
我们知道数组名就是数组首元素地址,所以我们在地址栏直接输入数组名,回车即可:
这样我们就可以看到每个地址对应的值了,注意这里是十六进制显示
通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置
步骤如下图所示:
结果如下:
可以切换到汇编代码,查看反汇编可以帮助我们更好地理解程序的执行过程和内部运行机制
步骤如下图所示:
还有一种比较直接的方法:
当调试开始后,鼠标单击右键,选择转到反汇编
结果如下:
可以查看当前运行环境的寄存器的使用信息。在调试过程中,查看寄存器信息可以帮助我们了解程序运行的状态和指令的执行过程。
步骤如下图所示:
结果如下:
一定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
多多使用快捷键,提升效率
求 1!+2!+3! …+ n! ;不考虑溢出。
//sum = 1! + 2! + 3! +...
int main()
{
int i = 0;
int sum = 0;//保存最终结果
int n = 0;
int ret = 1;//保存n的阶乘
scanf("%d", &n);
for(i=1; i<=n; i++)
{
int j = 0;
for(j=1; j<=i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
这时候我们如果3,期待输出9,但实际输出的是15。 如下图所示:
我们发现结果与我们预期实现的结果不一样,这表明我们的代码可能有点问题,如果直接观察或读代码无法找出错误原因,我们就可以通过调试来寻找错因:
我们发现当循环到
i = 3
时,在计算3!时ret应该等于3*2 = 6
,而这里ret = 12
,再仔细观察发现:
当开始计算3!时,ret是从2开始乘积的,所以造成了3!=12,故每次计算完阶乘我们都应该将ret置为1
在写代码时,我们不可避免会出现一些错误,以下是一些提高代码正确率的小tips:
以上就是今天所有的内容啦~ 大家要注意多多练习,完结撒花~ 🥳🎉🎉