语法检查
在编写程序的时候,我们都知道要遵循特定语言的语法,例如Java和C就有语法上的不同,下面是一个编译时出现的语法错误:
#include<iostream>
int main(int argc, char** argv)
{
int a[5]={0,1,2,3,4};
int sum=0;
for(int i=0;i<5;i++)
{
sum=sum+a[i];
}
printf("sum=%d \n",sum)
return 0;
}
编译器中有一个常见毛病是发现的错误位置比真正的错误要滞后一行。例如,编译器要编译下一行时才发现上一行缺少一个分号:
[Error]expected ';' before 'return'
语义检查
下面是数组我i<=5了,也就是数组发生了越界:
#include<iostream>
int main(int argc, char** argv)
{
int a[5]={0,1,2,3,4};
int sum=0;
for(int i=0;i<=5;i++)
{
sum=sum+a[i];
}
printf("sum=%d \n",sum);
return 0;
}
但是我的编译器却没有报错(这里我用的是Dev-C++ 5.11,有的会,有的不会),能够用C++中的异常处理,以下是数组越界的异常处理:
#include<iostream>
using namespace std;
enum index{underflow, overflow};
int array_index(int *A, int n, int index);
int main()
{
int *A = new int[10];
for(int i=0; i<10; i++)
A[i] = i;
try
{
cout<<array_index(A,10,5)<<endl;
cout<<array_index(A,10,-1)<<endl;
cout<<array_index(A,10,15)<<endl;
}
catch(index e)
{
if(e == underflow)
{
cout<<"index underflow!"<<endl;
exit(-1);
}
if(e == overflow)
{
cout<<"index overflow!"<<endl;
exit(-1);
}
}
return 0;
}
int array_index(int *A, int n, int index)
{
if(index < 0) throw underflow;
if(index > n-1) throw overflow;
return A[index];
}