关于调试的应用场景及如何编写优秀代码

简介: 关于调试的应用场景及如何编写优秀代码
  • 通过调试我们可以知道代码编写错误的原因。
  • 我们不断积累经验,就能够避免很多错误。

调试的应用场景

关于数组越界的计算机错误:(vs2020,X86,Debug环境下进行)

int main()
{
  int i = 0;
  int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  for (i = 0; i <= 12; i++)
  {
    arr[i] = 0;
    printf("hehe\n");
  }
  return 0;
}

结果就是死循环,不断地打印hehe。

接下来,我们调试,分析原因:

之后我们发现arr12的值与i的值一样变化。


数组越界并没有报错


接下来,我为大家分析这个数组越界导致无限循环的原理:

  • 内存分为栈区,堆区和静态区
  • 我们的局部变量储存在栈区中
  • 局部变量就是main函数里面的变量(也就是 i 和 arr[ i ] )


  • 1. 栈区内存的使⽤习惯是从⾼地址向低地址使⽤的,所以变量i的地址是较⼤的。arr数组的地址整体是⼩于i的地址。
  • 2. 数组在内存中的存放是:随着下标的增⻓,地址是由低到⾼变化的。
  • (这两句话非常重要,需要理解一下)


  • 数组越界的arr[12] 由于会与 i 的地址重合,因此当arr[12]=0时,i 也会同时变为0。
  • 最后导致无限循环。


优秀的代码

  • 代码运行正常
  • bug很少
  • 效率高
  • 可读性高
  • 可维护性高
  • 注释清晰
  • 文档齐全

错误分类

1.编译型错误

编译型错误⼀般都是语法错误,这类错误⼀般看错误信息就能找到⼀些蛛丝⻢迹的,双击错误信息也能初步的跳转到代码错误的地⽅或者附近。编译错误,随着语⾔的熟练掌握,会越来越少,也容易解决。


2.链接型错误

  • 标识符名不存在
  • 拼写错误
  • 头文件没包含
  • 引用的库不存在


3.运行时错误

  • 运行时的错误是最经常发生的,我们常常无法避免这种情况。
  • 但是我们可以通过不断地调试,找到错误的原因,减少这种情况。

如何写出优秀的代码

  • 积累经验。我们日常不断地积累,知道代码问题,分析原理之后,减少错误代码。

通过coding技巧减少运行时错误的发生

1.assert(断言)

  • 用法:assert(表达式)
  • 如果assert中的表达式为假,那么assert就会报错。
  • 避免运行时错误。

这里可以判断arr是不是为空指针。

判断a是否大于b。

  • 我们之后的代码会越来越复杂,assert可以保证我们代码的正确,assert也可以帮助我们找到代码错误的位置。
  • 在运行之前,就能报错,避免运行时错误。(运行时错误就是结果错误,需要我们一步一步去调试才能发现)

2.const

const放在 * 的左边

 const int*p
=int const* p
int main()
{
    int a = 10;
    int p = &a;
    const int* p=0;
    *p = 20;//这个表达式不可以运行。
}

p指向的对象不能通过p来改变,

但是p变量本身的值可以改变。

const放在 * 的右边

int* const p
int main()
{
int a = 10;
int b = 0;
int p = &a;
int* const p=0;
    p = &b;   //这个表达式不可以运行。
}

p本身的值不可以改变,但是p指向的对象可以改变。

我们可以通过const来控制一些变量的是否改变。

目录
相关文章
|
前端开发 Java
前端基础 - 常用调试方式
前端基础 - 常用调试方式
71 0
|
安全 C# 开发工具
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
模拟.NET实际应用场景,综合应用三个主要知识点:一是使用dnSpy反编译第三库及调试,二是使用Lib.Harmony库实现第三库拦截、伪造,三是实现同一个库支持多版本同时引用。
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
|
1月前
|
设计模式 机器学习/深度学习 算法
现代 Python:编写高效代码的模式、功能和策略(第 1 部分)
现代 Python:编写高效代码的模式、功能和策略(第 1 部分)
28 0
|
3月前
R语言错误处理与调试:如何高效调试R代码
【8月更文挑战第28天】调试R代码是一项需要不断练习和提高的技能。通过理解常见的错误类型、使用`traceback()`查看错误路径、逐步执行代码、利用`tryCatch()`捕获和处理错误、设置更严格的警告级别、利用RStudio的调试工具以及编写可复现的示例,你可以更加高效地调试R代码,并快速解决遇到的问题。
|
4月前
|
运维 监控 Java
函数计算产品使用问题之Java 17作为运行时环境,并已使用WebIDE完成代码的修改和调试,如何部署代码
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
程序员 编译器 C语言
编程最重要的技术之一 — 调试(以C语言代码为例)
编程最重要的技术之一 — 调试(以C语言代码为例)
105 0
|
程序员 C语言 C++
编程最重要的技术—调试(以C语言代码为例)
编程最重要的技术—调试(以C语言代码为例)
|
Java 开发工具 C#
如何以超快的方式调试?
如何以超快的方式调试?
|
XML 数据可视化 Java
代码对比工具,我就用这 6 个!
在程序开发的过程中,程序员会经常对源代码以及库文件进行代码对比,在这篇文章里我们向大家介绍六款程序员常用的代码比较工具。
371 0
代码对比工具,我就用这 6 个!