当我们按照自己的思路编写好一个完整的程序,就要对它进行调试(debug)了,调试过程包括我们熟悉的编译和连接,还包括运行和简单的数据测试等,如下图
调试主要分为4个步骤和两种处理方式,我们把程序的编译和连接统称为编译阶段,把程序的运行和测试统称为运行阶段。在编译阶段发生的错误称为编译错误,在运行阶段发生的错误称为运行时错误。对于编译错误,我们通过检查并修正语法错误来解决:对于运行时错误,我们通过检查并修正语意错误来解决。
- 如何检查语法错误
所谓语法错误是指在书写语句时没有按照相应的语法格式。常见的语法错误有变量未定义,括号不匹配,遗漏了分号。大多数的语法错误都是能够被编译器发现。因此,相对语意错误来说,语法错误更容易被发现,更容易被解决。
语法检查的工作由编译器来完成,很多情况下编译器无法智能的报告出真正的语法错误和错误位置。比如缺少一个变量的定义,而该变量在程中被使用6次,则编译器可能会报告6个甚至更多的语法错误,而实际上错误只有一个。所以,对编译器来说,任何一个语法错误都可能是“牵一发而动全身”的。
那么这种可能发生“误报”的情况下,我们如何才能快速,正确地找到错误的位置呢?
由于编译器是让顺序查找语法错误的,所以它所找到的第一个错误位置往往是正确的。如果程序规模不大,编译一次的时间不是很长,我们可以每次只修正编译器报告的第一个错误以及由此可发以发现的连带错误,直到整个程序没有任何错误为止,
下面我们就用这个方法来来检查下面的程序,
上图中的代码存在四个错误
第一个错误 i末定义 error C2065: 'i' : undeclared identifier
解决方法,for(int i=0,i<3;i++)
第二个错误 逗号语法错误 error C2143: syntax error : missing ',' before '
解决方法,for(int i=0;i<3;i++)
第三次错误 cin末定义 error C2065: 'cin' : undeclared identifier
解决方法 在 #include 下添加 using namespace std;
第四个错误 c末定义error C2065: 'c' : undeclared identifier
解决方法 int c=a+b;
至此,整个程序的所有语法错误都被检测出来并且被修正,程序编译阶段没有任何错误了。通过对这个程序的语法检查,我们总结出以下几点:
(1)编译器报告的第一个错误位置往往是有效的,但是报告的错误内容未必正确,比如第二次编译时报告的错误是在“小于号之前缺少了逗号”,而事实上问题是for语句中应该使用分号,所以,报告的错误内容只能参考。
(2)编译器报告的错误数目与实际错误数目未必符合,甚至可能改正一个错误后,错误数反而增加了,所以,报告的错误数目不能正确的描述实际的错误规模。
(3)编译器报告的警告也应当重视,有些人认为即使程序存在警告,但是它能正常运行,所以警告可以被忽视,这种想法是错误的,如果一个程序是完美的,为什么编译器还要给出警告?警告的存在就说明了这个程序有些地方还存在缺陷。
- 常见语法错误及解决方法
本篇完 !欢迎大家收藏与转发 下一篇<>