C语言程序设计初学者常犯错误集锦_第1页
C语言程序设计初学者常犯错误集锦_第2页
C语言程序设计初学者常犯错误集锦_第3页
C语言程序设计初学者常犯错误集锦_第4页
C语言程序设计初学者常犯错误集锦_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、很多学习C语言的同学总会犯这样那样的低级错误,而主流的编辑器VC+6.0虽然可以指出这些错误,但有时候,它对低级错误并不那么敏感,让很多初学者觉得“情何以堪”呐!本人也是C程初学者,在这,将自己常犯的一些错误列出来,并指出错误原因,希望对大家有帮助。另外,大家自己有什么典型错误的,也可一起分享,让我们一起努力吧!O(_)O一、从最简单的漏字多字开始吧:  1.1 在scanf赋值时漏&,实例如下:编译器产生如下错误提示:snowkey.cpp(7) : warning C4700: local variable 'c' used without ha

2、ving been initializedsnowkey.cpp(7) : warning C4700: local variable 'b' used without having been initializedsnowkey.cpp(7) : warning C4700: local variable 'a' used without having been initialized意:局部变量的使用没有被初始化 1.2 main函数后加;会产生一系列错误指示,系统会认为你main函数没定义,事实上,你只是多了加了个分号而已,典型如下: 

3、 编译器产生如下错误提示:(4) : error C2449: found '' at file scope (missing function header?)(17) : error C2059: syntax error : '' 1.3 定义数据类型时漏逗号, 也会产生一系列错误:  编译器产生如下错误提示:(4) : error C2146: syntax error : missing '' before identifier 'n'(4) : error C2065:

4、 'n' : undeclared identifier(4) : error C2146: syntax error : missing '' before identifier 'sum'(4) : error C2065: 'sum' : undeclared identifier这几条错误最容易误导初学者,表面上说missing '',事实上,是少了个逗号。事实上,“syntax error : missing '' before identifier 'n'”和“'

5、n' : undeclared identifier”要合起来理解。 1.4 printf函数没有用双引号括起来: 编译器产生如下错误提示: error C2001: newline in constant error C2146: syntax error : missing ')' before identifier 'scanf'意:新的一行没断开(指printf函数)    语法错误,少了)在定义scanf函数前事实上,是少了"同样的道理,如果在后面漏了字母

6、(如换行符n),也会显示同样的错误信息,要仔细查看,一般来说,把那整行仔细检查一遍就可发现错误原因。实例如下: 编译器产生如下错误提示:error C2001: newline in constanterror C2146: syntax error : missing ')' before identifier 'scanf'(和上面的一样) 1.5 漏赋初始值直接进入循环加这种错误时灰常致命的因为编译器往往检测不出,程序也能运行,但运行结果往往是错的。实例如下:    上例中(用于求一个数的位数及位

7、数之和的核心部分),cout未赋初始值,直接使用cout+,导致错误。然而,编译器却显示:0 error(s), 0 warning(s)    对这种隐形的错误,一开始总让人头疼,但有错误经验了,就知道该往哪些方向去查错了。       同样的情况我还遇到过的是,使用scanf函数的时候,对于double型数据,输成了%f,导致程序语法正确,逻辑错误,检查了很久才发现。大家在初学C的时候一定要注意double类型的输入输出格式是不同(%lf 和%f)。  

8、0;二、函数类错误2.1 调用函数时,误用已赋值参数:A图B图编译器产生如下错误提示:error C2082: redefinition of formal parameter 'n'意:重新定义n由于在main函数中n已经被赋值,故自定义的p函数就不可在重新使用n,可换用i,ri等任何不与main函数冲突的参数。 后记:找到个网址,里面也有很多错误的集合,有兴趣的朋友可以进一步阅读为了方便大家,我还是COPY过来了VC+编译的常见错误1、fatal error C1010: unexpected end of file while looking for preco

9、mpiled header directive。寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h")2、fatal error C1083: Cannot open include file: 'R.h': No such file or directory不能打开包含文件“R.h”:没有这样的文件或目录。3、error C2011: 'C': 'class' type redefinition类“C”重定义。4、error C2018: unknown character 

10、9;0xa3'不认识的字符'0xa3'。(一般是汉字或中文标点符号)5、error C2057: expected constant expression希望是常量表达式。(一般出现在switch语句的case分支中)6、error C2065: 'IDD_MYDIALOG' : undeclared identifier“IDD_MYDIALOG”:未声明过的标识符。7、error C2082: redefinition of formal parameter 'bReset'函数参数“bReset”在函数体中重定义。8、error C

11、2143: syntax error: missing ':' before ''句法错误:“”前缺少“;”。9、error C2146: syntax error : missing '' before identifier 'dc'句法错误:在“dc”前丢了“;”。10、error C2196: case value '69' already used值69已经用过。(一般出现在switch语句的case分支中)11、error C2509: 'OnTimer' : member functio

12、n not declared in 'CHelloView'成员函数“OnTimer”没有在“CHelloView”中声明。12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'重载的函数“void reset(int)”在类“B”中找不到。13、error C2555: 'B:f1': overriding virtual function differs from 'A:f1' only

13、by return type or calling convention类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。14、error C2660: 'SetTimer' : function does not take 2 parameters“SetTimer”函数不传递2个参数。15、warning C4035: 'f': no return value“f”的return语句没有返回值。16、warning C4553: '= =' : operator has no effect; did you intend '

14、;='?没有效果的运算符“= =”;是否改为“=”?17、warning C4700: local variable 'bReset' used without having been initialized局部变量“bReset”没有初始化就使用。18、error C4716: 'CMyApp:InitInstance' : must return a value“CMyApp:InitInstance”函数必须返回一个值。19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writi

15、ng连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C:C(void)"连接时发现没有实现的外部符号(变量、函数等)VC6.0编译常见错误第一部分 编译错误1 error C2001: newline in constant编号:C2001直译:在常量中出现了换行。错误分析:(1) 字符串常量、字符常量中是否有换行。(2) 在这句语句中,某个字符串常量的尾部是否漏掉了双引号。(3)

16、 在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“"”。(4) 在这句语句中,某个字符常量的尾部是否漏掉了单引号。(5) 是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。 2 error C2015: too many characters in constant编号:C2015直译:字符常量中的字符太多了。错误分析:单引号表示字符型常量。一般的,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。另外,如果语句中某个字符常量缺少右

17、边的单引号,也会引发这个错误,例如:if (x = 'x | x = 'y') 值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。两个单引号之间不加任何内容会引发如下错误:error C2137: empty character constant。 3 error C2018: unknown character '0x#'编号:C2018直译:未知字符0x#。错误分析:0x#是字符ASC码的16进制表示法。这里说的未知字符,通常是指全角符号、字母、数字

18、,或者直接输入了汉字。如果全角字符和汉字用双引号包含起来,则成为字符串常量的一部分,是不会引发这个错误的。4 error C2041: illegal digit '#' for base '8'编号:C2141直译:在八进制中出现了非法的数字#(这个数字#通常是8或者9)。错误分析:如果某个数字常量以“0”开头(单纯的数字0除外),那么编译器会认为这是一个8进制数字。例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同于是进制中的“57”。 5 error C2065: 'xxxx' :

19、undeclared identifier编号:C2065直译:标识符“xxxx”未定义。错误分析:首先,解释一下什么是标识符。标志符是程序中出现的除关键字之外的词,通常由字母、数字和下划线组成,不能以数字开头,不能与关键字重复,并且区分大小写。变量名、函数名、类名、常量名等等,都是标志符。所有的标志符都必须先定义,后使用。标志符有很多种用途,所以错误也有很多种原因。(1) 如果“xxxx”是一个变量名,那么通常是程序员忘记了定义这个变量,或者拼写错误、大小写错误所引起的,所以,首先检查变量名是否正确。(关联:变量,变量定义)(2) 如果“xxxx”是一个函数名,那就怀疑函数名是否没有定义。可

20、能是拼写错误或大小写错误,当然,也有可能是你所调用的函数根本不存在。还有一种可能,你写的函数在你调用所在的函数之后,而你有没有在调用之前对函数原形进行申明。(关联:函数申明与定义,函数原型)(3) 如果“xxxx”是一个库函数的函数名,比如“sqrt”、“fabs”,那么看看你在cpp文件已开始是否包含了这些库函数所在的头文件(.h文件)。例如,使用“sqrt”函数需要头文件math.h。如果“xxxx”就是“cin”或“cout”,那么一般是没有包含“iostream.h”。(关联:#include,cin,cout)(4) 如果“xxxx”是一个类名,那么表示这个类没有定义,可能性依然是:

21、根本没有定义这个类,或者拼写错误,或者大小写错误,或者缺少头文件,或者类的使用在申明之前。(关联:类,类定义)(5) 标志符遵循先申明后使用原则。所以,无论是变量、函数名、类名,都必须先定义,后使用。如使用在前,申明在后,就会引发这个错误。(6) C+的作用域也会成为引发这个错误的陷阱。在花括号之内变量,是不能在这个花括号之外使用的。类、函数、if、do(while)、for所引起的花括号都遵循这个规则。(关联:作用域)(7) 前面某句语句的错误也可能导致编译器误认为这一句有错。如果你前面的变量定义语句有错误,编译器在后面的编译中会认为该变量从来没有定义过,以致后面所有使用这个变量的语句都报这

22、个错误。如果函数申明语句有错误,那么将会引发同样的问题。 6 error C2086: 'xxxx' : redefinition编号:C2374直译:“xxxx”重复申明。错误分析:变量“xxxx”在同一作用域中定义了多次。检查“xxxx”的每一次定义,只保留一个,或者更改变量名。 7 error C2374: 'xxxx' : redefinition; multiple initialization编号:C2374直译:“xxxx”重复申明,多次初始化。错误分析:变量“xxxx”在同一作用域中定义了多次,并且进行了多

23、次初始化。检查“xxxx”的每一次定义,只保留一个,或者更改变量名。 8 C2143: syntax error : missing '' before (identifier) 'xxxx'编号:C2143直译:在(标志符)“xxxx”前缺少分号。错误分析:这是VC6的编译期最常见的误报,当出现这个错误时,往往所指的语句并没有错误,而是它的上一句语句发生了错误。其实,更合适的做法是编译器报告在上一句语句的尾部缺少分号。上一句语句的很多种错误都会导致编译器报出这个错误:(1) 上一句语句的末尾真的缺少分号。那么补上就可以了。(2) 上一句语句

24、不完整,或者有明显的语法错误,或者根本不能算上一句语句(有时候是无意中按到键盘所致)。(3) 如果发现发生错误的语句是cpp文件的第一行语句,在本文件中检查没有错误,而且这个文件使用双引号包含了某个头文件,那么检查这个头文件,在这个头文件的尾部可能有错误。 9 error C2137: empty character constant编号:C2137直译:空的字符定义。错误分析:原因是连用了两个单引号,而中间没有任何字符。一般的,单引号表示字符型常量,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待)。两个单引号之间不加任何内容是不允许的。

25、需要注意的是:如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。如果单引号中的字符数多于4个,会引发2015错误:error C2015: too many characters in constant。 10 error C2374: 'xxxx' : redefinition; multiple initialization编号:C2374直译:“xxxx”重复申明,多次初始化。错误分析:变量“xxxx”在同一作用域中定义了多次,并且进行了多次初始化。检查“xxxx”的每一次定义,只保留一个,或者更改变量名。第二部分 链接错误1 error LNK2001: unresolved external symbol _main编号:LNK2001直译:未解决的外部符号:_main。错误分析:缺少main函数。看看main的拼写或大小写是否正确。 2 error LNK2005: _main already defined i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论