【初阶C语言】实用调试技巧(详细介绍)(二)

简介: 【初阶C语言】实用调试技巧(详细介绍)(二)

4. 多多动手,尝试调试,才能有进步


一定要熟练掌握调试技巧。

初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。

我们所讲的都是一些简单的调试。

以后可能会出现很复杂调试场景:多线程程序的调试等。

多多使用快捷键,提升效率。


5. 一些调试的实例


5.1 实例一

实现代码:求 1!+2!+3! …+ n! ;不考虑溢出。

int main()
{
  int i = 0;
  int sum = 0;//保存最终结果
  int n = 0;
  int ret = 1;//保存n的阶乘
  scanf("%d", &n);  //举一个1到3的阶乘,1到3,1!+2!+3!=1 + 2 + 6 =9但编译器结果为15
  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;
}


举一个1到3的阶乘,1到3,1!+2!+3!=1 + 2 + 6 =9但编译器结果为15

这时候我们如果3,期待输出9,但实际输出的是15。


why?

这里我们就得找我们问题。


首先推测问题出现的原因。初步确定问题可能的原因最好。

实际上手调试很有必要。

调试的时候我们心里有数

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;
  ret = 1;//经过调试,这样改就对了
  for (j = 1; j <= i; j++)
  {
    ret *= j;
  }
  sum += ret;
  }
  printf("%d\n", sum);
  return 0;
}


5.2 实例二

#include <stdio.h>
int main()
{
  int i = 0;
  int arr[10] = { 0 };
  for (i = 0; i <= 12; i++)
  {
  arr[i] = 0;
  printf("hehe\n");
  }
  return 0;
}


研究程序死循环的原因

原理:


i 和 arr 是局部变量,局部变量是放在栈区上的。

栈区内存的使用习惯是,先使用高地址处的空间,再使用低地址处的空间,再使用低地址处的空间。

数组随着下标的增长,地址是由低到高变化的。


注意:

该代码的运行结果是跟环境有关的。

相关文章
|
6天前
|
C语言
C语言初阶:如何判断是否为素数并且输出
C语言初阶:如何判断是否为素数并且输出
10 0
|
6天前
|
安全 编译器 程序员
【C语言】:VS实用调试技巧和举例详解
【C语言】:VS实用调试技巧和举例详解
11 1
|
24天前
|
存储 编译器 C语言
C语言学习记录——调试技巧(VS2019环境下)
C语言学习记录——调试技巧(VS2019环境下)
22 2
|
2天前
|
程序员 编译器 C语言
C语言中的assert.h:调试助手与断言详解
C语言中的assert.h:调试助手与断言详解
4 0
|
27天前
|
C语言
【初始C语言8】详细讲解初阶结构体的知识
【初始C语言8】详细讲解初阶结构体的知识
|
1月前
|
程序员 C语言 C++
C语言实用的调试技巧
C语言实用的调试技巧
19 3
|
1月前
|
程序员 编译器 测试技术
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
29 1
|
1月前
|
C语言
C语言初阶测评
C语言初阶测评
22 0
|
1月前
|
程序员 C语言 C++
C语言——调试技巧
C语言——调试技巧
|
1月前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
26 0