IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 初入C语言_9 -> 正文阅读

[C++知识库]初入C语言_9

  1. VS调试方法(VS2019为例)

今天的内容不多,并不是只是类的博文,也相对来说不是特别重要,来讲一些编译器的调试功能,其实在写博客最开始就应该介绍这个的,但是奈何我忘记了,我们来开始吧。

1.bug

我们在玩游戏的时候经常会听到有人说这游戏bug太多,我会卡某某游戏的bug,那么从小叫到大的东西,这个bug到底是什么呢?

?如果你去英文词典查bug的意思发现叫臭虫,飞虫的意思,早在计算机刚刚诞生的年代,那时候的电脑操作者可不像现在每家每户,那时候搞电脑的都叫科学家,科学家们有一天突然发现计算机不能像正常进行工作了,于是就钻进庞大的计算机里去找问题,终于在某个地方发现了一只死掉的虫子,清理干净后机器又可以正常运转了,?这就是世界上的第一个bug,也叫做漏洞,也就是可能在面对一个程序时的非常规操作或者程序本身就存在问题时出现的不按正常轨迹巡行的现象,这时候就需要我们程序员有非常过硬的调试技能,那么什么叫调试呢?

2.调试是什么?有多重要?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程 序错误的一个过程。

所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有 愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。顺 着这条途径顺流而下就是犯罪,逆流而上,就是真相。

我们在写代码时完成给定的任务是一方面,在即完成工作的情况下也能找出自己写的代码问题也是技能之一,调试找错在编程中占着很大一部分比重,不然为什么要有测试开发这个岗位,万一没有经过测试调试找错直接发行给用户,让用户找到程序的bug问题就严重了,可能涉及到这款软件带来的利润情况和你公司的名声问题。当然言重了,不过说来说去就是想让大家记得写和调是齐头并进的,会写更要会调。

调试要做到:发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法 对程序错误予以改正,重新测试。

3.如何调试

以vs2019为例,当然只要你使用的是vs系列的编译器应该都大同小异,我们来讲一下调试究竟该怎么调试,如何一步步发现自己搞毁我们代码的bug在哪里(当然最大的bug就是我们自己)。

首先进入我们的vs,在最上方的按钮里找到:调试

?这个就是我们进入调试窗口的入口,当我们先写好一段代码准备测试时,可以点开它,会弹出以下功能

?这两个就是我们最常用的调试手段,当然我们也可以按下键盘上的F10或者F11进行调试,什么叫逐过程和逐语句呢?逐过程的意思就是当我遇到一个外部函数我不会进入这个函数为你展开详情,我只会一步带过只给你显示这个函数运行后的结果,逐过程固然高效,但是要建立在你明知自己 的函数语法逻辑完全正确的情况下。逐语句当然就是相反了,当遇到函数时会进入函数,也一步一步执行函数内的语句,如果推荐的话肯定首推F11,可以更加彻底地查看你的代码。

当你按下F10或者F11后就已经进入到了调试阶段,你可以在调试里找到窗口,然后找到监视,其中监视1234随意选一个,就可以看到具体的变量在程序运行后的变化。

?点开监视后,可以输入你想监视的变量名,然后继续按F10或F11进行逐过程或者逐语句的调试。

可以看到我定义的变量a和变量b以及承担Add函数返回值的ret都在程序运行到最后时都已经变成了属于它们自己的值,旁边的黄色小箭头就是程序目前运行到的步骤。

这里再介绍一个功能:断点,当你在调试时想让程序直接运行到某一步直接停下时可以使用,在小黄箭头所在列选择你想让程序运行停止到哪一步,然后点一个红点点,调试时遇到这个断点程序就会自动停止,当然我本人认为这个功能作用不是很大,因为我再平时调试时都是整个程序或者整个函数进行调试,会比较放心,当然因人而异,如果你认为你能力很强,可以直接忽略前面,直接来到你想监视的地方。

4.Debug和Release的介绍。

大家可能会发现在vs最上方调试一栏下面有一个小白框,里面写着“Debug”,这就是编译器为我们提供的两种模式,debug称为测试版本,也叫调试版本,说白了就是还在处于准备阶段,里面还有一些bug可能尚未解决,如果你点开Debug旁边的小按钮,你会发现另一个“Release”,这就是另一个版本,称为发行版本,意为程序已经没什么bug了,可以发行给用户了,我们用这个版本,当然vs默认我们写程序的版本时Debug,毕竟谁也不是写完就要给用户,我们只是学习C语言而已。

概念:

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。? Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。

我们在Debug版本生成文件后会在该文件路径下找到一个Debug文件,?这就是vs编译器为我们提供的可执行程序,当然这是测试版本的可执行程序。?

?Release版本:

?debug和release版本在反汇编上是不同的,也就是为什么两个版本会有这么大的不同,所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程,而Release版本会对代码进行一定的优化,毕竟属于是发行版本。

我们来看一段代码:

#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;
}

如果是 debug 模式去编译,程序的结果是死循环。 如果是 release 模式去编译,程序没有死循环。 那 他们之间有什么区别呢? 就是因为优化导致的,变量在内存中开辟的顺序发生了变化,影响到了程序执行的结果。

5.调试实例

接下俩我给大家几道之前写过的题,大家可以试着调试一下, 你就明白一段代码从开始到结束变量之间到底是怎么变化的,有问题到底是出在哪里。

//eg1
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;
}
//eg2
#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;
}

6.如何写出好(易于调试)的代码

讲了这么久,究竟该如何写出“好”代码呢?代码也分好坏吗?完成功能不就可以了吗?不是的,在编程当中,一些写作习惯甚至都可以称为评判此代码好坏的标准,那么接下来我就来讲如何写出“好”代码。

优秀的代码: 1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 5. 可维护性高 6. 注释清晰 7. 文档齐全

常见的coding技巧: 1. 使用assert 2. 尽量使用const 3. 养成良好的编码风格 4. 添加必要的注释 5. 避免编码的陷阱。

①assert:

assert的中文意思是断言,坚持,维护的意思,当你使用这条语句时意为你认为你的某些变量的直恒为真,当然assert里只能判断变量的值,不可以替代if else语句的功能

char * strcpy(char * dst, const char * src)
{
        char * cp = dst;
        assert(dst && src);
 
        while( *cp++ = *src++ )
               ;     /* Copy src over dst */
        return( dst );
}

这里用assert的意思就是我认为传参进来的dst和src两个指针恒指向非NULL,也是对代码的一种保护。

②const:

const是C语言里对指针维护的一种手段,当你认为某个指针或者某个变量是不可随意修改的,可以在其前面加上const变量,此变量就不可以再修改,用法见以上代码。

const修饰指针变量的时候: 1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改 变。但是指针变量本身的内容可变。 2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指 针指向的内容,可以通过指针改变。

③好的编码风格:

我上文讲一些不好的编码风格甚至也可以作为评判代码好坏的标准,那么何以见得呢?

?大家觉得这两种编码方式哪种看起来更加清楚明了呢?很明显是第一种,第二种的编码方格让人看了觉得自己甚至没学懂C语言,就好像你进入了大学,在小学中学阶段一直习惯说家乡话,到了大学大家都说普通话就你自己一直操着一嘴家乡话让人摸不着头脑,和你说话还要太费劲,你还不愿意改,这是一个意思,为了让大家都可以看懂你的代码,请使用良好的编码风格。

详情可以去看一本书《高质量的C/C++编程》里面讲了对于c代码的编写风格。

好了,关于代码的调试和找错以及编程时该注意的事项暂时就这么多,如果还有额外我后期会补充,大家下期再见。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:40:26  更:2021-10-07 13:41:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:34:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码