1、程序某位置上一个真正的语法错误可能导致编译器认为它发现了其他错误。

     例如,程序未能正确生命变量,当后面用到这些变量的时候,编译器可能认为它

     发现了更多的错误。实际上,不同立即试图改正所有发现的错误,只是修改前一个

    或前两个,然后编译,其余的某些错误就可能会消失。一直这样做,直到程序能够

    运行为止。

例如:

#include<stdio.h>

int main(void)
{
	int n, int n2, int n3;
	
	n = 5;
	n2 = n * n;
	n3 = n2 * n2;
	printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3);
	return 0;
}

程序中声明int n, int n2, int n3;应该改为:int n, n2, n3;

编译以上程序,编译器输出:

main.cpp: In function 'int main()':
main.cpp:5:9: error: expected unqualified-id before 'int'
  int n, int n2, int n3;
         ^

main.cpp:8:2: error: 'n2' was not declared in this scope
  n2 = n * n;
  ^
main.cpp:9:2: error: 'n3' was not declared in this scope
  n3 = n2 * n2;

可以看出第一个错误比较准确,第二个、第三个错误是第一个错误引起的。

修改程序代码:

#include<stdio.h>

int main(void)
{
	int n, n2, n3;
	
	n = 5;
	n2 = n * n;
	n3 = n2 * n2;
	printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3);
	return 0;
}

程序编译、运行成功:

2、编译器的另一个常见毛病是发现的错误位置比真正的错误要滞后一行。例如:编译器要编译下一行时才发现上一行

     缺少了一个分号。因此,如果编译器指出某个具有分号的行少了一个分号,那么请检查上一行。

    例如以下程序:

   

#include<stdio.h>

int main(void)
{
	int n, n2, n3;
	
	n = 5;
	n2 = n * n;
	n3 = n2 * n2;
	printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3)
	return 0;
}

printf语句后面少了一个分号,编译器输出为:

main.cpp: In function 'int main()':
main.cpp:11:2: error: expected ';' before 'return'
  return 0;

编译器提示的是return 0;之前少了一个分号

编译器指向的行也是return所在的行,但是需要向前一行查找错误。

修正代码之后,程序正常编译、运行。

#include<stdio.h>

int main(void)
{
	int n, n2, n3;
	
	n = 5;
	n2 = n * n;
	n3 = n2 * n2;
	printf("n = %d, n squared = %d, n cubed = %d\n", n, n2, n3);
	return 0;
}

程序编译、运行成功:

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐