我爱编程C语言程序员

C语言/C++编程学习:程序中对错误的调试

2018-05-05  本文已影响0人  小辰带你看世界

C语言是面向过程的,而C++是面向对象的

C和C++的区别:

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

程序调试

现在我们已经可以编写一个简单的 C语言程序了,但是你可能会犯一些简单的错误。程序的错误通常叫做 bug,而发现和修正这些错误的过程叫做调试。下面有一个带有一些错误的程序,看看你能找出多少。

C语言程序中对错误的调试

语法错误

上面的程序中包含了几个语法错误。如果你不遵循 C语言的规则就会犯语法错误。C 的语法错误是指把正确的 C符号放在了错误的位置。那么程序 上面的程序中到底出现了什么语法错误呢?

错误一:它使用圆括号而不是花括号来包围函数体,这是正确的 C 符号用错了位置的情况。

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

C语言程序中对错误的调试

错误二:声明应该采用以下形式:

int n, n2, n3;

C语言程序中对错误的调试

或者采用以下形式

int n;

int n2;

int n3;

C语言程序中对错误的调试

错误三:示例程序中忽略用一个 */ 符号来结束注释。

C语言程序中对错误的调试

或者也可以用新形式 //来替代/*

C语言程序中对错误的调试

修改完错误之后调试运行试试:

C语言程序中对错误的调试

没有语法错误了!

那么我们如何检测程序的语法错误?首先,在编译前浏览程序的源代码看看是否有明显的错误。其次,可以查看由编译器发现的错误,因为它的工作之一就是检测语法错误。在编译程序时,编译器会报告所找到的任何错误,同时指出每一个错误的性质和位置。

C语言程序中对错误的调试

然而,编译器也会发生错误。大家可以看到上面的内容,这里位置上一个真正的语法错误可能导致编译器误认为它发现了其他错误。例如,因为上面的程序末能正确声明 n2 和 n3,当后面用到这些变量的时候,编译器可能认为它发现了更多的错误。实际上,不用立刻试图改正所有发现的错误,只是修改前一个或前二个,然后重新编译,其余的某些错误就可能会消失。一直这样做,直到程序能够运行为止。编译器的另一个常见毛病是发现的错误位置比真正的错误要滞后一行。例如,编译器要编译下一行时才发现上一行缺少一个分号。因此,如果编译器指出某个具有分号的行少了一个分号,那么请检查上一行。

语义错误

语义错误就是在意思上的错误。例如,考虑下面的句子:furry inflation thinks greenly。句子中形容词,名词,动词和副词的位置都很正确,所以语法没有错,但是句子却什么意思也没表达出来。在 C 中,当你正确遵循 C语言的规则,但是结果不正确的时候,那就是犯了语义错误。示例程序中有这样一个错误:

n3 = n2 * n2;

此处,原本是希望 n3 代表 n 的三次方, 但是代码把它设置成了 n 的四次方。

这样的语义错误编译器是检测不到的,因为它没有违反 C语言的规则。编译器无法了解你的真正意图,只好留给你自己去找出这类错误。那么你就需要去将自己计算出来的结果和与程序给出的结果比较了。

例如,假设你已经修正了上面程序中的语法错误,现在程序应该如下图所示。

C语言程序中对错误的调试

输出结果是:

n =5, n的平方 = 25, n的立方 = 625

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

如果你懂得立方的话,就会知道结果 625 是错误的。下一步要跟踪程序是如何得出这个答案的。对于本例,通过观察你可能会发现其中的错误,但你需要采取更为系统的方法。方法之一就是把自己想你成计算机,跟着程序的步骤一步一步的执行。现在让我们试一下这种方法。

程序体一开始是声明 3个变量:n,n2,n3.

第一步,程序把 5赋给变量 n, n就变成5。

第二步n 和 n 相乘,然后把结果赋给 n2, 5和5相乘得到25,结果 n2变成25.

第三步 n2 和 n2相乘,然后把结果赋给 n3, 25和25相乘得到625, 结果 n3变成625。

哦,原来是在进行 n2的平方而不是用 n去相乘了。

对于上面的例子,这个过程可能比较烦琐一点。但用这种方式一步一步地查看程序的执行情况通常是发现程序中问题所在的最好方法。

程序状态

通过手工方式一步一步地跟踪程序,并记录每个变量,这样就可以监视程序状态。程序状态是指在程序执行过程中的给定点上所有变量值的集合。它是当前计算状态的一个快照。

我们刚刚讨论了跟踪程序状态的方法之一:自己逐步执行程序。然而,对于迭代10000次的程序,这样的任务你是不可能完成的。不过,你仍然可以跟踪其中的一小部分选代看看程序是不是按照你所期望的方式执行的。然而,经常有这么一种可能,即你是按照你的期望那样去执行步骤,而不是按照你实际所写的代码去执行的,因此要尽量忠于实际的代码。

另一种查找语义错误的方法是,在程序的几个关键点处加入额外的 printf()语句以监视所选变量的值。通过观察变量值的变化可以了解程序的执行情况。当程序的工作让你满意之后,就可以把额外的语句去掉,然后重新编译。

检查程序状态的第三种方法是使用调试器。调试器是一种程序,让你能够一步一步运行另一个程序并检查该程序的变量值。不同的调试器具有不同的易用性和复杂度。较高级的调试器可以显示出正在执行的源代码行。这对于有多条可选执行路径的程序来说是非常方便的,因为可以很容易地知道执行了哪条特殊路径。如果你的编译器带有调试器,那么现在请花点时间去学会怎么用它。

关键字和保留标识符

关键字是 C语言中的词汇。因为它们对 C来说比较特殊,所以你不能将它们用作标识符,例如作为变量名。许多关键字用于指定不同的类型,比如 int。其他的关键字,比如 if,用来控制程序中语句的执行顺序。

如果试图把一个关键字用作变量名,编译器把它作为一个语法错误捕获到。还有一些你不该用的其他字符,称为保留标识符。因为它们是合法的名字,所以并不引起语法错误。保留标识符包括那些以下划线字符开始的标识符和标准库函数的名字, 例如 printf()。

关键概念

计算机编程是一件富有挑战性的事情。它需要抽象的,概念性的思考并细致地对待细节问题。你会发现编译器强迫你注意细节问题。当你跟朋友谈话时,你可以用错几个字,犯一两个语法错误,可能还有几个没有结束的句子,但朋友能明白你想说什么。而编译器却不允许这样做,对于编译器来说,几乎正确仍然等于错误。

了解了这么多,我们的目标应该是理解什么是 C程序。你可以这么理解:程序是对你希望计算机采取何种行为的描述。编译器负责完成把你的描述转换成底层的机器语言的细节工作。由于编译器不具有真正的智能,所以必须把你对程序的描述用编译器的术语表达出来,这些术语就是 C标准所设置的格式规则!

总结

总的来说,C语言程序是由一个或者多个函数组成的。每一个 C程序必须包含一个名为main()的函数,因为程序开始时要调用该函数。一个简单的函数结构台下:函数头后面紧跟着一个开始花括号,后面是构成函数体的语句,然后是起终止作用的结束花括号。

每个C语句都是一个针对计算机的指令,并以一个分号作为结束标志。声明语句为变量指定一个名字并指明该变量中存储的数据类型。赋值语句把值赋给变量,或者更一般地说,是把值赋给存储区域。函数调用语句会导致所指定函数的执行。当被调函数执行完毕之后,程序会返回到函数调用之后的语句继续进行。printf()函数用于输出语句和变量的值。

小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

一门语言的语法是一套规则,用于管理这种语言中的合法语句组织在一起的方式。语句的语义就是它所表达的意思。编译器可以帮助你发现语法上的错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检测语义错误可能包括跟踪程序的状态,即程序每执行一步之后所有变量的值。

如果可以的话,请大家多多转发关注,谢谢支持!

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

上一篇下一篇

猜你喜欢

热点阅读