在C语言中,计算机程序通常有哪几种错误?

在C语言中,计算机程序通常有哪几种错误?,第1张

1、系统错误:这是指程序没有语法错误和逻辑错误,但程序的正常运行依赖于某些外部条件的存在,如果这些外部条件缺失,则程序将不能运行。

2、语法错误:这是指程序中含有不符合语法规定的语句,例如关键字或符号书写错误(将printf写成print、将数组元素引用写成a(2)等)、使用了未定义的变量、括号不配对等。

3、逻辑错误:这是指程序中没有语法错误,可以通过编译、连接生成可执行程序,但程序运行的结果与预期不相符的错误。

扩展资料:

C语言程序的特点

1、采用结构化的控制语句,是完全模块化和结构化的语言。

2、数据类型丰富,具有现代语言的各种数据结构

3、语法限制不太严格,程序设计自由度大,同时也意味着容错性差。

4、允许直接访问屋里内存,能进行位 *** 作,能实现汇编语言的大部分功能,可直接对硬件进行 *** 作,兼有高级和低级语言的特点。

5、目标代码质量高,程序执行效率高(比汇编程序生成的目标代码低10%-20%)

6、允许在编译之前使用预处理命令,提高编程效率。

7、以内存使用为核心。

8、C语言程序是由函数构成的。一个源程序不论有多少个文件组成,包含多少个函数,都有且一个 main 函数,及主函数。一个程序总是从 main 函数开始执行,而不论 main 函数在程序什么位置,程序的执行也结束于主函数,其他函数通过函数调用被执行。

9、函数都要有类型说明,放在函数名前,如 void 表示空类型,没有返回值。

10、函数体内语句一般按四大功能顺次排列,即首先对变量与函数做声明 ——>变量赋初值 ——>数据计算与处理 ——>输出结果。

一、基础知识和数据类型、表达式

1、{},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。

2、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。

3、混淆/和\;注释对应的符号是/* */,而转义字符是以\开头,除号是/。

4、printf()和scanf()的参数设置有误,主要表现在以下几方面:

l 类型不匹配的问题。(例如:有float a=3.5,但输出的时候printf(“a=%d”,a)则屏幕上会显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应%f, int对应%d, char对应%c。

l 个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。

l scanf()中变量前忘了加&。记住:scanf()中变量前要有&(但后边学到的字符数组名和指针前不用加)

5、定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium of circle一般情况下可用下划线将三个单词连接在一起。

6、在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。

 void main()

{ int I,a[10], sum=0 /*只要下边要用,这个定义就必须要有,一般情况下也要有初始值*/

for(I=0I<10I++) sum+=a[I]

printf(“%d”,sum)

}

7、计算错误。主要注意:++,――和其它运算符一起运算时,除根据优先级进行计算时,还要考虑先后位置的特殊含义;数据类型不一致时发生的自动转换也会导致计算的误差;还要注意求模结果的符号与被除数相同;某些特殊情况下 使用懒惰求值法。

8、不能除以0,要做合法性检查;

9、类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范围之内;

10、数学表达式的格式有误。常见的有:(1)数学与C语言运算表达式的混淆(例如:=表示赋值,而= =才表示我们数学中的相等关系)。(2)、忽略了运算的优先级。解决这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完优先级高的一个表达式后加上()再写下一级的表达式,例如:计算梯形的面积时,要s=((a+b)*h)/2,不要1/2*a+b*h. (3)忽略了计算和赋值时的自动转换。例如:float half=1/2这样,因为=右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不是变量,例如:若有#define PI 3.14,程序中又出现PI=3.14159。又例如:f(n)=f(n-1)*n(这是典型的数学语言,在C语言中右边的乘积不能正确存储,而左边又是一个函数调用)。

11、使用库函数前忘了加#include<?.h>

二、流程控制

1、 丢掉语句结束标记“;”,尤其是for语句中表达式后或do-while语句后的分号,或在预处理命令后边、while()后、for()后加“;”;

2、 If语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意C语言的条件与数学表达式的区别(例如我们数学中经常写到的0≤x≤9,在C语言中应该写成x>=0&&x<=9)。

3、 if-else嵌套时不配对。最好在写每个条件时要用两个{}分别将两个分支先括起来,再添加其中的语句,以保证其配对不易错。

4、 switch()语句中的格式不正确。()中的表达式结果一定是一些明确的值,不能是区间;表达式的所有可能结果要列在case后边,case与常量之间有一空格,不要丢掉必要的break

5、 随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循环体中,不要将循环控制变量进行另外的改变。

6、 分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当I不变,j又循环一遍的时候用双重循环。当I,j同时变化的时候用一重循环,此时,循环控制变量有两个,但条件只写一个就可以,因为另一个总是进行相应的变化的。

7、 忽略循环体与循环控制变量的关系。其实,很多情况下,循环控制变量都在循环体中起到非常重要的作用。应该利用上这种关系。

三、数组与指针

1、 字符串的输入有错误:主要表现在使用scanf()或gets()时加了&,或输入字符串时用循环,(这样的话,字符个数无论多长,都不会为自动加\0,将来引用的时候也就不能以字符串的形式引用。)

2、 对字符串的处理中,循环条件仍然写成I<N。由于字符串是不定长的,所以循环条件一般为str[I]!=’\0’ 或I<strlen(str)

3、 而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指针)不能加&。

4、 指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起的灾难性错误。

5、 分不清p和*p。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二级指针或多级指针,取*以后得到的仍然可能是地址。

四、函数

1、 函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号

2、 函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组int a[]的时候,给出的a[]或a[I].

3、 递归时忘了设置边界条件,这样易造成死循环调用。

4、使用函数之前未声明(包括C库函数的声明)。建议大家,将所定义的一切函数都在程序开始的预处理命令后加上函数原型的声明,这样做不仅可以避免错误,而且整个程序的结构看起来更清楚。

五、结构体共用体

1、 结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了birthday)

2、 结构体类型名和结构体变量名混淆。例如:

struct STU

{….

Struct data

{int year,month,day<br/><br/>}birthday

}

struct STU astruct STU是类型名称,而且不分配空间,且不能直接引用。只有定义了结构体类型struct STU的变量a以后,才为a分配相应的内存空间,引用时也要是a.???

3、 结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时候。一定要一级一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.birthday.year. 不能直接a.year.

4、 对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对结构体变量整体 *** 作,只能一个成员一个成员地输入、输出。

5、 不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们,并分别按不同类型引用它们。切记:共用体变量不能做函数形参。

六、文件

1、 使用之前没有打开文件,使用之后没有关闭文件。

2、 相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数声明)的一致。

/zhidao.baidu.com/question/186344584.html>

1.书写标识符时,忽略了大小写字母的区别。

main()

{

int a=5

printf("%d",A)

}

编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。

2.忽略了变量的类型,进行了不合法的运算。

main()

{

float a,b

printf("%d",a%b)

}

%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。

3.将字符常量与字符串常量混淆。

char c

c="a"

在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。

4.忽略了“=”与“==”的区别。

在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写

if (a=3) then …

但C语言中,“=”是赋值运算符,“==”是关系运算符。如:

if (a==3) a=b

前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。

5.忘记加分号。

分号是C语句中不可缺少的一部分,语句末尾必须有分号。

a=1

b=2

编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。

{ z=x+y

t=z/100

printf("%f",t)

}

对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。

6.多加分号。

对于一个复合语句,如:

{ z=x+y

t=z/100

printf("%f",t)

}

复合语句的花括号后不应再加分号,否则将会画蛇添足。

又如:

if (a%3==0)

I++

本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。

再如:

for (I=0I<5I++)

{scanf("%d",&x)

printf("%d",x)}

本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。

7.输入变量时忘记加地址运算符“&”。

int a,b

scanf("%d%d",a,b)

这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。

8.输入数据的方式与要求不符。①scanf("%d%d",&a,&b)

输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:

3,4

输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。

②scanf("%d,%d",&a,&b)

C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:

3,4

此时不用逗号而用空格或其它字符是不对的。

3 4 3:4

又如:

scanf("a=%d,b=%d",&a,&b)

输入应如以下形式:

a=3,b=4

9.输入字符的格式与要求不一致。

在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。

scanf("%c%c%c",&c1,&c2,&c3)

如输入a b c

字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。

10.输入输出的数据类型与所用格式说明符不一致。

例如,a已定义为整型,b定义为实型

a=3b=4.5

printf("%f%d\n",a,b)

编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12034926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存