发布网友 发布时间:2022-04-23 00:47
共1个回答
热心网友 时间:2023-09-30 03:56
语法错误是指在书写语句时没有按照相应的语法格式。常见的语法错误有变量未定义、括号不匹配、遗漏了分号等等。大多数的语法错误都是能够被编译器发现的。因此相比于语意错误,语法错误更容易被发现,更容易被解决。
语法检查的工作由编译器完成,很多情况下编译器无法智能地报告出真正的语法错误数和错误位置。比如缺少一个变量的定义,而该变量在程序中被使用了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=0;i<3;i++)
第三次编译的第一个错误:
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=0;i<3;i++)
{
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行。我们不需要自己去数行数,只需要双击这个错误就能到达对应的行。