语法错误是指在书写语句时没有按照相应的语法格式。常见的语法错误有变量未定义、括号不匹配、遗漏了分号等等。大多数的语法错误都是能够被编译器发现的。因此相比于语意错误,语法错误更容易被发现,更容易被解决。
语法检查的工作由编译器完成,很多情况下编译器无法智能地报告出真正的语法错误数和错误位置。比如缺少一个变量的定义,而该变量在程序中被使用了6次,则编译器可能会报告6个甚至更多的语法错误,而实际上错误只有一个。所以,对编译器来说,任何一个语法错误都可能是“牵一发而动全身”的。
那么在这种可能发生“误报”的情况下,我们如何快速、正确地找到错误的位置呢?
由于编译器是按顺序查找语法错误的,所以它所找到的第一个错误的位置往往是正确的。如果程序规模不大,编译一次的时间不是很长,我们可以每次只修正编译器报告的第一个错误以及由此可以发现的连带错误,直到整个程序没有任何错误为止。
下面我们就用这种方法来检查一个程序的语法错误:(程序11.3.1)
#include <iostream>
mian()
{
int a,b
for (i=0,i<3,i++)
{
cin >>a >>b
c=a+b
cout <<c <<endl
}
return 0
}
第一次编译的第一个错误:
I:\program\vc\book\11_3_1\main.cpp(5) : error C2065: 'i' : undeclared identifier//未声明的标识符
……
main.obj - 7 error(s), 3 warning(s)//一共还有7个错误和3个警告
第一次修改:
for (int i=0,i<3,i++)
第二次编译的第一个错误:
I:\program\vc\book\11_3_1\main.cpp(5) : error C2143: syntax error : missing ',' before '<'//逗号语法错误
……
main.obj - 8 error(s), 3 warning(s) //一共还有8个错误和3个警告
第二次修改:
for (int i=0i<3i++)
第三次编译的第一个错误:
I:\program\vc\book\11_3_1\main.cpp(7) : error C2065: 'cin' : undeclared identifier//未声明的标识符
……
main.obj - 4 error(s), 3 warning(s) //一共还有4个错误和3个警告
第三次修改:
添加using namespace std
第四次编译的第一个错误:
I:\program\vc\book\11_3_1\main.cpp(9) : error C2065: 'c' : undeclared identifier//未声明的标识符
……
main.obj - 1 error(s), 1 warning(s)//一共还有1个错误和1个警告
第四次修改:
int c=a+b
第五次编译的第一个错误:
I:\program\vc\book\11_3_1\main.cpp(12) : warning C4508: 'mian' : function should return a value'void' return type assumed//函数需要返回一个值
……
main.obj - 0 error(s), 1 warning(s) //一共还有1个警告
第五次修改:
int mian()
第六次编译:
main.obj - 0 error(s), 0 warning(s)//编译正确
第一次连接的第一个错误:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main//没有main函数
……
11_3_1.exe - 2 error(s), 0 warning(s)//一共还有2个错误
第六次修改:
int main()
第七次编译:
main.obj - 0 error(s), 0 warning(s)//编译正确
第二次连接:
11_3_1.exe - 0 error(s), 0 warning(s)//连接正确
完整的程序:
#include <iostream>
using namespace std
int main()
{
int a,b
for (int i=0i<3i++)
{
cin >>a >>b
int c=a+b
cout <<c <<endl
}
return 0
}
至此,整个程序的所有语法错误都被检查出来并且被修正。程序编译阶段没有任何错误了。通过对这个程序的语法检查,我们总结出以下几点:
编译器所报告的第一个错误位置往往是有效的,但是报告的错误内容未必正确。比如第二次编译时报告的错误是“在小于号之前缺少了逗号”,而事实上问题是for语句中应该使用分号。所以,报告的错误内容只能参考,却不能完全相信。
编译器报告的错误数目与实际错误数目未必符合。甚至第一次改正一个错误后,错误数反而增加了。所以,报告的错误数目不能正确描述实际的错误规模。
编译器报告的警告也应当被重视。有些人认为即使程序存在警告,但是它能正常执行,所以警告可以被忽视。这种想法是错误的。如果一个程序是完美的,为什么编译器还要给出警告呢?警告的存在就说明了这个程序有些地方还不符合正确的语法。
I:\program\vc\book\11_3_1\main.cpp(5)括号中的5表示错误在程序的第5行。我们不需要自己去数行数,只需要双击这个错误就能到达对应的行。
mcgs策略没有通过语法检查,说明程序有语法错误。当程序编译不成功时,就会发生一些错误,包括语法错误、运行时错误和逻辑错误。
一、语法错误。
不正确地创建代码时就会出现语法错误,包括错误地输入关键字,遗漏了必要的标点符号或者不正确的结构。
Visual Basic包含有【自动语法检测】选项,可以在用户编写程序时检测和更正语法错误。如果使用了这个选项,Visual Basic就会在用户输入程序时解释这个程序。当它发现错误时,就会加亮显示这个程序代码并显示一个消息框来解释原因和提供帮助。这样用户就可以在继续编程之前更正错误。
二、运行时错误。
当程序语句试图执行一条不可能执行的 *** 作时,就会发生运行时错误。
常见的运行时错误是试图从一个不存在的文件中读取数据,另一个是试图执行被零除的 *** 作。
在用户的程序中为这些错误提供出错处理函数和错误处理例程是很重要的。
三、逻辑错误。
当应用程序不能按期望的方式执行时会发生逻辑错误。这些错误是很难发现的。因为应用程序的语法完全合法,运行时也不执行非法 *** 作,但是仍然会产生错误。这类错误通常不会产生出错消息。验证应用程序执行的唯一方法就是测试它并分析运行结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)