下载此beplayapp体育下载

诊断错误及其处理.docx


beplayapp体育下载分类:医学/心理学 | 页数:约19页 举报非法beplayapp体育下载有奖
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该beplayapp体育下载所得收入归上传者、原创者。
  • 3.下载的beplayapp体育下载,不会出现我们的网址水印。
beplayapp体育下载列表 beplayapp体育下载介绍
该【诊断错误及其处理 】是由【zhangkuan1436】上传分享,beplayapp体育下载一共【19】页,该beplayapp体育下载可以免费在线阅读,需要了解更多关于【诊断错误及其处理 】的内容,可以使用beplayapp体育下载的站内搜索功能,选择自己适合的beplayapp体育下载,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此beplayapp体育下载到您的设备,方便您编辑和打印。一、诊断错误及其处理
防止程序出出错的第一一关是编译译器。如果果遇到约束束违规的情情况或语法法错误,编编译器至少少会生成一一个诊断错错误信息。大大多数编译译器将其诊诊断信息分分为两类::错误和警警告。语法法错误很常常见,也较较易修改。调调试程序时时首先要改改正的是语语法错误,调调试本身是是一种艺术术,是程序序中断时试试着去修复复的一种艺艺术。
糟糕的语法法会使编译译器混乱,甚甚至可能达达到生成很很多错误的的程度,程程序设计者者对这种情情况不要大大惊小怪,应应冷静对待待,其实很很可能仅仅仅是由于某某一个语句句引起的,比比如说漏掉掉了whiile循环环中的一个个大括号或或语句末尾尾键入了冒冒号而非分分号等。为为此我们应应该养成一一种****惯,自自顶向下的的修改方法法,每次从从错误表的的开头开始始,一次修修改一、二二个错误再再编译,或或许错误就就能减少许许多甚至全全部语法错错误。
模块化程序序设计也有有助于程序序的排错。调调试一个充充满连接和和转折、全全局变量等等的程序要要比调试一一个精心设设计的模块块化程序困困难得多。如如果程序分分成几个模模块,各个个模块负责责程序的一一个专项功功能,一旦旦识别出问问题可能所所处的模块块,就很容容易地通过过检查源代代码方式来来发现错误误,这种策策略也称为为分治法,因因为如果知知道了没有有问题之处处,几乎等等同于知道道了问题发发生的地方方。
有时我们也也可以忽略略警告,但但这并非是是一种良好好的编程********惯,追踪踪每个警告告的原因并并认真考虑虑是否有更更稳健的方方法编写代代码能够帮帮助编程者者编写更好好的代码。如如果我们只只是忽略它它,当这些些“无害”的警告不不断累积到到一定程度度时,可能能面临出现现混乱的危危险。
二、差1错错误及其处处理
在C语言中中,一个拥拥有n个元元素的数组组,不存在在下标为nn的元素,其其元素下标标的允许取取值范围为为0到n--1。请考考察下列一一段代码::
intaa[10]],i; for((i=1;;i<==10;i++)) a[ii]=0;;
这段代码本本意是要设设置数组aa中的100个元素均均为0,却却产生了一一个出人意意料的“副作用”。循环把把并不存在在的a[110]元素素设置为00。如果用用来编译这这段程序的的编译器按按照内存地地址递减的的方式来给给变量分配配内存,则则内存中数数组a之后后的2个字字节实际上上分配给了了整型变量量i。此时时,本来循循环计数器器i的值为为10,循循环体内
将将并不存在在的a[110]设置置为0,实实际上却是是将计数器器i的值设设置为0,这这就陷入了了死循环。
这是程序设设计中较常常见也较难难觉察的一一类错误,被被称为“差一错误误”(offf-by--oneerroor)。“差一错误误”也称“栏杆错误误”,问题说说的是:1100英尺尺长的围栏栏每隔100英尺需要要一根支撑撑用的栏杆杆,一共需需要多少根根呢?如果果不假思索索,将1000除以110得到110,当然然这个答案案是错误的的,正确的的答案应该该是11。是是否存在一一些编程技技巧,能够够降低这类类错误发生生的可能性性呢?“不对称边边界”法给程序序设计带来来的便利非非常明显。在在“不对称边边界”法中,可可以规定数数组元素的的第一个“入界点”(对C语语言而言,00就是数组组下标的第第一个“入界点”)和第一一个“出界点”(对上述述定义的数数组而言,第第一个出界界点就是110,它不不在数组下下标范围之之内)。在在这种方法法下,“出界点”的值即是是数组的长长度。
三、“悬挂挂”elsee错误及其其处理
这个问题并并非C语言言所独有,也也已经为人人熟知,但但即使是有有经验的CC程序员,也也常常在此此失误。如如果想实现现当x分分别是大于于0、等于于0和小于于0时y值值分别取得得1、0和和-1。考考虑下面的的程序片段段:
y=0;
if(x>>=0)
if((x>0))y==1;
elsey=-11;
然而,这段段代码实际际上所做的的与编程者者的愿望相相去甚远。原原因在于CC语言中有有这样的规规则,ellse总是是与同一对对括号内最最近的未匹匹配的iff结合。如如果我们按按照上面这这段程序实实际上被执执行的逻辑辑来调整代代码缩进,大大致是这样样:
y=0;
if(x>>=0)
if(xx>0)y=11;
elsey=-11;
也就是说,并并非是当xx<0时yy=-1,而而是当x==0时也使使y=-11。
解决这一问问题我们可可以用“封装”的办法,将将上述程序序改为:
y=0;
if(x>>=0)
{iff(x>00)yy=1;}}
elsey=-11;
现在,ellse与第第一个iff结合,即即使它离第第二个iff更近也是是如此,因因为此时第第二个iff已经被括括号“封闭”起来了。
四、整数溢溢出及其处处理
C语言为编编程者提供供了三种不不同长度的的整数:sshorttintt、intt和lonnginnt,但不不管是哪种种类型表示示的整数总总有一定的的范围,越越出该范围围时称为整整数的溢出出。例如现现有算法要要求如下::求满足条条件1+22+3+……+n≤327667的最大大整数n,请请考察如下下程序段::
intnn=1,ssum=00;
whilee(summ<=322767)){suum+=nn;n+++;}
printtf(“n=%dd\n”,n-11);
乍看该程序序时无错误误,但事实实上,上列列程序中的的whille循环是是一个无限限循环,原原因在于iint型数数的表示范范围为-3327688到+322767,当当累加和ssum超过过327667时,便便向高位进进位,而对对int型型数而言,最最高位表示示符号,故故sum超超过327767后便便得到一个个负数,wwhilee条件当然然满足,从从而形成无无限循环。此此时,最好好的解决办办法是将ssum定义义为lonnginnt型。
五、词法陷陷井及其处处理
(1)=不不同于===
这是初学者者最易犯的的一个错误误,符号==作为赋值值运算符,符符号==作作为比较。一一般而言,赋赋值运算相相对于比较较运算出现现得更频繁繁,因此,字字符数少的的符号=就就被赋予了了更常用的的含义―――赋值运算算。此外,在在C语言中中赋值符号号被作为一一种操作符符对待,因因而重复进进行赋值运运算(如aa=b=cc=5)可可很容易地地书写,并并且赋值操操作还可以以嵌入到更更大的表达达式中。这这种使用上上的便利性性可能导致致一个潜在在的问题::本意是作作比较运算算时,却可可能无意中中误写成了了赋值运算算。该错误误大多数情情况下可
以以通过简单单的要素项项重排而防防止。从编编译器的角角度出发,对对于相等测测试,变元元在等号的的哪一边无无关紧要,如如果两边都都是变量,则则需要留意意符号“=”的个数。但但是,如果果一边是常常量,则存存在可以防防止错误的的适当措施施。我们何何不养成把把常量放在在比较运算算符左边的的****惯呢??因为这样样一来,即即便漏掉了了一个“=”符号,保保证会出现现一个编译译错误,因因为不能给给常数赋值值。
(2)字符符与字符串串
C语言中的的单引号和和双引号含含义迥异,用用单引号引引起的一个个字符实际际上代表一一个整数,整整数值对应应于该字符符在编译器器采用的字字符集中的的序列值,因因此,采用用ASCIII字符集集的编译器器而言,‘‘a’的含义与与01411或97严严格一致。而而用双引号号引起的字字符串,代代表的却是是一个指向向无名数组组起始字符符的指针,该该数组被双双引号之间间的字符以以及一个额额外的二进进制值为零零的字符‘‘\0’初始化。
整型数(一一般为166位或322位)的存存储空间中中可以容纳纳多个字符符(一般为为8位),因因此,有的的C编译器器允许在一一个字符常常量(以及及字符串常常量)中包包含多个字字符。也就就是说,用用‘yes’代替“yes”不会被编编译器检测测到,后者者的含义是是“依次包含含‘y’、‘e’、‘s’以及字符符‘\0’的4个连连续内存单单元的首地地址”,而前者者的含义并并没有正确确地定义,有有些C编译译器会处理理成出错,但但大多数CC编译器的的理解为“一个整数数值,由‘‘y’、‘e’、‘s’所代表的的整数值按按照特定编编译器实现现中定义的的方式组合合得到”。因此,这这两者如果果在数值上上有什么相相似之处,也也完全是一一种巧合而而已。
(3)整数数溢出
C语言为编编程者提供供了三种不不同长度的的整数:sshorttintt、intt和lonnginnt,但不不管是哪种种类型表示示的整数总总有一定的的范围,越越出该范围围时称为整整数的溢出出。例如现现有算法要要求如下::求满足条条件1+22+3+……+n≤327667的最大大整数n,请请考察如下下程序段::
intnn=1,ssum=00;
whilee(summ<=322767)){suum+=nn;n+++;}
printtf(“n=%dd\n”,n-11);
乍看该程序序时无错误误,但事实实上,上列列程序中的的whille循环是是一个无限限循环,原原因在于iint型数数的表示范范围为-3327688到+322767,当当累加和ssum超过过327667时,便便向高位进进位,而对对int型型数而言,最最高位表示示符号,故故sum超超过327767后便便得到一
个个负数,wwhilee条件当然然满足,从从而形成无无限循环。此此时,最好好的解决办办法是将ssum定义义为lonnginnt型。
(4)词法法分析中的的“贪心法”
C语言中的的某些符号号,例如//、*、==、+等,只只有一个字字符长,称称为单词符符符号。而而/*、===、+++等包含了了多个字符符,称为多多字符符号号。当C编编译器读入入一个字符符‘/’后又跟了了一个字符符‘*’,那么编编译器就必必须做出判判断:是将将其作为两两个分别的的符号对待待,还是合合起来作为为一个符号号对待。CC语言的处处理策略是是“贪心法”,即从左左到右一个个字符一个个字符地读读入,如果果该字符可可能组成一一个符号,那那么再读入入下一个字字符,判断断已经读入入的两个字字符组成的的字符串是是否可能是是一个符号号的组成部部分;如可可能,再读读入下一个个字符,重重复上述判判断,直到到读入的字字符组成的的字符串已已不再可能能组成一个个有意义的的符号为止止。所以aa---bb:应理解解为(a---)-bb;而将描描述命题xx除以p所所指向的值值时,应书书写为:yy=x/((*p);;而不要写写为:y==x/*pp,因为编编译器将//*理解为为一段注释释的开始。
六、C语言言常见错误误小结
C语言的的最大特点点是:功能能强、使用用方便灵活活。C编译译的程序对对语法检查查并不象其其它高级语语言那么严严格,这就就给编程人人员留下“灵活的余余地”,但还是是由于这个个灵活给程程序的调试试带来了许许多不便,尤尤其对初学学C语言的的人来说,经经常会出一一些连自己己都不知道道错在哪里里的错误。看看着有错的的程序,不不知该如何何改起,本本人通过对对C的学********积累了了一些C编编程时常犯犯的错误,写写给各位学学员以供参参考。
,忽略了了大小写字字母的区别别。
mainn()
{
inta=5;;
prinntf(""%d",,A);
}
编译程序序把a和AA认为是两两个不同的的变量名,而而显示出错错信息。CC认为大写写字母和小小写字母是是两个不同同的字符********惯上,符符号常量名名用大写,变变量名用小小写表示,以以增加可读读性。
,进进行了不合合法的运算算。
mainn()
{
floaata,,b;
prinntf(""%d",,a%b));
}
%是求余余运算,得得到a/bb的整余数数。整型变变量a和bb可以进行行求余运算算,而实型型变量则不不允许进行行“求余”运算。

charrc;
c="aa";
在这里就就混淆了字字符常量与与字符串常常量,字符符常量是由由一对单引引号括起来来的单个字字符,字符符串常量是是一对双引引号括起来来的字符序序列。C规规定以“”作字符符串结束标标志,它是是由系统自自动加上的的,所以字字符串“a”实际上包包含两个字字符:‘a‘和‘‘,而把把它赋给一一个字符变变量是不行行的。
“=”与“==”的区别。
在许多高高级语言中中,用“=”符号作为为关系运算算符“等于”。如在BBASICC程序中可可以写
if((a=3))theen…
但C语言言中,“=”是赋值运运算符,“==”是关系运运算符。如如:
if((a==33)a==b;
前者是进进行比较,aa是否和33相等,后后者表示如如果a和33相等,把把b值赋给给a。由于于****惯问题题,初学者者往往会犯犯这样的错错误。

分号是CC语句中不不可缺少的的一部分,语语句末尾必必须有分号号。
a=1
b=2
编译时,编编译程序在在“a=1”后面没发发现分号,就就把下一行行“b=2”也作为上上一行语句句的一部分分,这就会会出现语法法错误。改改错时,有有时在被指指出有错的的一行中未未发现错
误误,就需要要看一下上上一行是否否漏掉了分分号。
{z==x+y;;
t=z//100;;
prinntf(""%f",,t);
}
对于复合合语句来说说,最后一一个语句中中最后的分分号不能忽忽略不写((这是和PPASCAAL不同的的)。

对于一个个复合语句句,如:
{z==x+y;;
t=z//100;;
prinntf(""%f",,t);
};
复合语句句的花括号号后不应再再加分号,否否则将会画画蛇添足。
又如:
if((a%3===0);;
I++;;
本是如果果3整除aa,则I加加1。但由由于if(a%33==0))后多加了了分号,则则if语句句到此结束束,程序将将执行I+++语句,不不论3是否否整除a,II都将自动动加1。
再如:
for(I=00;I<55;I+++);
{scaanf(""%d",,&x);;
prinntf(""%d",,x);}}
本意是先先后输入55个数,每每输入一个个数后再将将它输出。由由于forr()后多多加了一个个分号,使使循环体变变为空语句句,此时只只能输入一一个数并输输出它。
“&”。
inta,b;;
scannf("%%d%d"",a,bb);
这是不合合法的。SScanff函数的作作用是:按按照a、bb在内存的的地址将aa、b的值值存进去。
“&a”指a在内存中的地址。

①scannf("%%d%d"",&a,,&b);;
输入时,不不能用逗号号作两个数数据间的分分隔符,如如下面输入入不合法::
3,4
输入数据据时,在两两个数据之之间以一个个或多个空空格间隔,也也可用回车车键,跳格格键tabb。
②scannf("%%d,%dd",&aa,&b));
C规定::如果在“格式控制制”字符串中中除了格式式说明以外外还有其它它字符,则则在输入数数据时应输输入与这些些字符相同同的字符。下下面输入是是合法的::
3,4
此时不用用逗号而用用空格或其其它字符是是不对的。
343:44
又如:
scannf("aa=%d,,b=%dd",&aa,&b));
输入应如如以下形式式:
a=3,,b=4

在用“%%c”格式输入入字符时,“空格字符”和“转义字符”都作为有效字符输入。
scannf("%%c%c%%c",&&c1,&&c2,&&c3);;
如输入aabcc
字符“aa”送给c11,字符“”送给c22,字符“b”送给c33,因为%%c只要求求读入一个个字符,后后面不需要要用空格作作为两个字字符的间隔隔。

例如,aa已定义为为整型,bb定义为实实型
a=3;;b=4..5;
prinntf(""%f%ddn",aa,b);;
编译时不不给出出错错信息,但但运行结果果将与原意意不符。这这种错误尤尤其需要注注意。
,企图规规定精度。
scannf("%%",&aa);
这样做是是不合法的的,输入数数据时不能能规定精度度。

例如:根根据考试成成绩的等级级打印出百百分制数段段。
swittch(ggradee)
{caase‘‘A‘:priintf(("85~~100nn");(不不知道为什什么这里的的反斜线打打不出来!!)
casee‘B‘:priintf(("70~~84n"");(不不知道为什什么这里的的反斜线打打不出来!!)
casee‘C‘:priintf(("60~~69n"");(不不知道为什什么这里的的反斜线打打不出来!!)
casee‘D‘:priintf(("<600n");;(不知道道为什么这这里的反斜斜线打不出出来!)
defaault::prinntf(""erroorn"));(不知知道为什么么这里的反反斜线打不不出来!)
由于漏写写了breeak语句句,casse只起标标号的作用用,而不起起判断作用用。因此,当当gradde值为AA时,prrintff函数在执执行完第一一个语句后后接着执行行第二、三三、四、五五个priintf函函数语句。正正确写法应应在每个分分支后再加加上“breaak;”。例如
casee‘A‘:priintf(("85~~100nn");bbreakk;(不知知道为什么么这里的反反斜线打不不出来!)
-wwhilee语句在细细节上的区区别。
(1)mmain(()
{intta=00,I;
scannf("%%d",&&I);
whille(I<<=10))
{a=aa+I;
I++;;
}
prinntf(""%d",,a);
}
(2)mmain(()
{intta=00,I;
scannf("%%d",&&I);
do
{a=aa+I;
I++;;
}whiile(II<=100);
prinntf(""%d",,a);
}
可以看到到,当输入入I的值小小于或等于于10时,二二者得到的的结果相同同。而当II>10时时,二者结结果就不同同了。因为为whille循环是是先判断后后执行,而而do-wwhilee循环是先先执行后判判断。对于于大于100的数whhile循循环一次也也不执行循循环体,而而do-wwhilee语句则要要执行一次次循环体。

intn;
scannf("%%d",&&n);
inta[n]];
数组名后后用方括号号括起来的的是常量表表达式,可可以包括常常量和符号号常量。即即C不允许许对数组的的大小作动动态定义。
,将定定义的“元素个数数”误认为是是可使的最最大下标值值。
mainn()
{staaticinta[100]={11,2,33,4,55,6,77,8,99,10}};
prinntf(""%d",,a[100]);
}
C语言规规定:定义义时用a[[10],表表示a数组组有10个个元素。其其下标值由由0开始,所所以数组元元素a[110]是不不存在的。
,未使使用静态存存储。
inta[3]]={0,,1,2}};
这样初始始化数组是是不对的。CC语言规定定只有静态态存储(sstatiic)数组组和外部存存储(exxtermm)数组才才能初始化化。应改为为:
statticiintaa[3]=={0,11,2};;
&的位置置加了地址址运算符。
scannf("%%s",&&str));

诊断错误及其处理 来自beplayapp体育下载www.apt-nc.com转载请标明出处.

相关beplayapp体育下载 更多>>
非法内容举报中心
beplayapp体育下载信息
  • 页数19
  • 收藏数0 收藏
  • 顶次数0
  • 上传人zhangkuan1436
  • 文件大小50 KB
  • 时间2022-11-05