C语言程序设计中常见错误分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结果是本身-1,然而第二种输出形式就应该将 1 的二进制码取反加 1,最后再换算成十进制
形式。在计算的过程中一共有 16 位二进制数转换成十进制,很容易出现错误。这里总结出
一个很简单的公式,计算起来特别方便。对于有符号和无符号数的相互转换归纳如下:有符
号数 d 转化成无符号数 u:u=d+65536,而无符号数 u 转换成有符号数 d:d=u-65536。故本
2 数据类型的转换——有符号转换成无符号型
在学习 C 语言的数据类型时,有时候会遇到将有符号的数据转换成无符号的数据。要想
解决这个问题,我们一定要明白数据在计算机中是如何存储的。数据在机器中的存储是以二
进制补码形式存储,正数的符号“+”用二进制数 0 表示,而负数的符号“-”用 1 来表
示。正数的原码补码相同,但是负数的补码是其原码的二进制位取反加 1。这样来回转换很
第二次循环:执行 for 语句中的表达式 3 ,即 y 的值自增 1 变成了 2,2 是小于 50 的, 所以执行循环体,x 此时为 6 故第一个 if 语句不执行,而第二个 if 语句也不执行,只好做 最后一个语句 x 自减 3 变成了 3 ,本次循环执行完毕,进入下次循环。
第三次循环:执行 for 语句中的表达式 3 ,即 y 的值自增 1 变成了 3,3 是小于 50 的 所以执行循环体,x 此时为 3 故第一个 if 语句不执行,而第二个 if 语句要执行,x 本身要 增加 5 变成 8,然后执行 continue 语句,也就是结束这次循环进入下次循环。
C 语言程序设计中常见错误分析
谢娜 (蚌埠学院计算机科学与技术系 安徽蚌埠 233030)
摘要:随着计算机科学技术的发展,C 语言在 IT 行业中的地位很重要。各所高校都开设 C
语言程序设计课程。但是在学习过程中有些知识点对于部分学生尤其是初学者来说难以理 解、掌握,很容易出现错误。本文针对这部分的知识点进行了详细的介绍和解释,举出具体 实例分析错误的主要原因,以期对读者有所帮助。
5 函数参数值传递
在函数参数传递的过程中,有好多同学很容易搞错,实参在传递过程中什么时候值不 变,什么时候传值后改变?对于这个问题我们可以先看一个例题。
例题 5: void swap(int m, int n) { int temp;
temp=m;m=n;n=temp; } main() {int m=5,n=9;
第四次循环:执行 for 语句中的表达式 3 ,即 y 的值自增 1 变成了 4,4 是小于 50 的 所以执行循环体,x 此时为 8 故第一个 if 语句不执行,而第二个 if 语句也不执行,只好做 最后一个语句 x 自减 3 变成了 5 ,本次循环执行完毕,继续进入下次循环。
第五次循环:执行 for 语句中的表达式 3 ,即 y 的值自增 1 变成了 5,5 是小于 50 的 所以执行循环体,x 此时为 5 故第一个 if 语句不执行,而第二个 if 语句要执行,x 本身要 增加 5 变成 10,然后执行 continue 语句,也就是结束这次循环进入下次循环。
第一次循环:先判断表达式 2,即判断条件表达式 y<=50 是否成立。y 的值为 1,故成 立,然后执行循环体,由于 1 是小于 10,所以第一个 if 语句不执行,而 1 取 2 的余数等 于 1,所以做第二个 if 语句(该语句是一条复合语句),x 本身自加 5 变成了 6,然后执行 continue 语句,也就是结束这次循环,下面的语句不做了,进入下次循环。
swap(m,n); printf(“%d,%d\n”,m,n); } 分析:该程序主要由两个函数构成,在主函数中调用了 swap()函数,并且两个函数使 用了相同名称的变量,虽然实参和形参名称相同,但是却代表不同的变量。主函数有两个变 量 m 和 n,分别赋值为 5 和 9,通过函数调用把初值传递给形参的 m 和 n,在 swap 函数中形 参 m 和 n 通过了第三个变量 temp 交换了值,形参的值交换和实参没有任何联系,实参的值 没有任何变化,所以在主函数中输出的 m 和 n 仍然是原来的 5 和 9。本题中共有四个相同类 型的普通变量,它们互不干扰,个人做个人的事情。当实参传完值后,实参的任务就完成了, 故形参值交换对实参没有任何影响。如果我们将上面的程序的子函数改为: void swap(int *m, int *n) { int temp;
不能正确地区分转义字符和普通字符。
例题 1.求字符串“ab\x41\\34cd\102y”的长度是:
A)10 B)12
C)14
D)18
分析:本题很容易犯的错误就是把字符串中的字符全部当作普通的字符处理。在上面的
字符串中,C 语言一般是尽可能的优先考虑转义字符,看是否能够组成转义字符,如果不能 才作为普通的字符来处理。实际上该题中的字符应该是 10 个,分别是‘a’ 、‘b’、‘\x41’、 ‘\\’、‘3’、‘4’、‘c’、‘d’、‘\102’和‘y’。其中的‘\x41’是十六进制的转义字符,而 ‘\102’是八进制的转义字符。另外,在转义字符中最值得注意的是八进制和十六进制的转 义字符。如‘\108’就不是一个转义字符,因为其中的数字 8 不是八进制中的数,它超出了 0~7,同理在十六进制的转义字符中也不能存在超出十六进制的数。
第六次循环:执行 for 语句中的表达式 3 ,即 y 的值自增 1 变成了 6,6 是小于 50 的 所以执行循环体,x 此时为 10 故第一个 if 语句要执行,执行 break 语句,也就是跳出了总 循环,提前结束了 for 语句,最后变量 x, y 的值分别是 10 和 6。
总之,在循环语句中,最主要的就是能够分析清楚语句的构成,熟练的掌握每个语句的 作用。即使特别复杂的程序也能够一目了然。
关键词:C 语言,转义字符, break, continue, 函数参数, 宏定义
Abstract: Along with the computer science technology development, the C language is very important in the IT profession status. Each university all opens the C language programming curriculum. But in the C language study process, some knowledge is difficult to be understood, to be grasped, regarding the partial students in particular beginners, and is very easy to make the mistake. This article has carried on the detailed introduction and the explanation in view of this part of knowledge spot, and points out the concrete example parse error the primary cause, has the help to the reader with expectation. Key words: C language, figurative meaning character, break, continue, function parameter, great definition
1 转义字符
C 语言也像其他的语言一样,有自己的一些字符集。普通的字符是由单个字符组成,
而转义字符却是很特殊的一类字符,它是以一个键盘符号反斜杠字符“\”开始后跟上单个 字符或是若干个字符组成的[1]。Fra Baidu bibliotek常用来表示键盘上的控制代码或特殊符号,例如回车换行
符、响铃符号等。在学习的过程中,有时会遇到普通字符和转义字符在一起使用,有些学生
致的;而输出表列部分中的每个参数之间一定要用逗号隔开。只有细心的编写程序,才能很 顺利通过上机调试。
4 break 语句和 continue 语句
在 C 语言过程中,好多初学者搞不清楚 break 语句和 continue 语句,没有真正的理解 两者的含义,所以也容易犯错误。这两个语句都可以用在循环语句中,但两者的作用不同, break 语句主要的作用是用来跳出该循环,提前结束循环,接着执行循环语句下面的语句。 而 continue 语句主要作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进 行下一次是否执行循环的判定[3]。
0 引言
近年来,随着计算机科学技术的发展和在各领域的渗透,尤其是软件人才的需求增多, 各高校计算机专业和非计算机的理工专业都开设了 C 语言这门课程。C 语言能够让你深入系 统底层,所有的操作系统如 windows,Unix,Linux,Mac,os/2 等都是用 C 语言编写的,如果不 懂 C 语言,怎么就不可能深入到操作系统当中去,更不要说去写它们的内核程序了;很多新 型的语言都是由 C 语言衍生出来的如:C++ ,Java ,C#, J#, perl 等,可以说掌握了 C 语言, 就掌握了许多门编程语言的基础,只要再经过简单的学习,就可以用这些新型的语言去开发 软件了;目前,C 语言还作为国家和各省计算机水平等级考试的科目,由此可以看出 C 的重 要性。然而对于部分学生尤其是初学者来说,学习 C 语言感到比较困难。笔者长期担任 C 语言教学工作,对在教学过程中发现学生容易出现的一些学习问题,进行了归纳总结。这部 分的知识点主要包括:对转义字符的深入理解、数据类型的转换、多个格式描述字符—%的 连续使用、break 语句和 continue 语句的区别、函数参数值传递和带参宏定义的展开等。对 于每个知识点还列举了有代表性的实例进行分析,希望能够对学习者有一定的帮助。
例题 4:若 x,y 均是 int 型变量,则执行以下的语句后,x,y 值是______。 for(y=1,x=1;y<=50;y++) { if(x>=10) break; if(x%2= =1) {x+=5;continue;} x-=3; }
分析:本题是一个复杂的 for 语句,循环体是由两个 if 语句和一个赋值语句组成,而 两个 if 语句分别含有 break 语句和 continue 语句。根据 for 语句的执行过程,首先是将 x,y 变量分别赋值为 1,然后开始循环:
麻烦,也容易搞错。
例题 2.若 int 类型占两个字节,则执行以下语句输出的结果是:___。
int k= -1;
printf(“%d,%u\n”,k,k);
A)-1,-1 B)-1,65536 C)-1,32768
D)-1,65535
分析:本题是将“-1”以两种形式输出来,第一种是普通的有符号“%d”形式,输出的
题中-1 转换成无符号数应该是 65535。
3 多个格式描述字符—%的连续使用
在 C 语言中“%”作为格式描述字符用在输入输出语句中,如果我们将多个“%”一起使 用则会出现什么样的结果? 例题 3:#include<stdio.h>
main() { int a=2,b=3;
printf(“a=%%d,b=%%d\n”,a,b); printf(“a=%%%d,b=%%%d\n”,a,b); } 分析:本题中的第一个输出语句中使用的是两个“%”,而在 C 语言中两个连续%在一起 则不作为格式描述符号使用,而是作为一个“%”字符输出[2],后面的 d 作为非格式字符原 样输出。所以第一个输出语句结果是:a=%d,b=%d。 对于第二个输出语句中一共有 3 个“%”,那么在使用的时候同样也是将前面的两个连续 的“%”作为一个字符“%”输出,而后面剩下的“%d”又作为格式描述字符处理,所以最后 的输出结果是:a=%2,b=%5。举一反三,当有 4、5、6 或多个“%”的时候,也同样如此。 此外,学生在调试程序时候遇到输入输出格式也经常会出现一些错误,比如在 printf 函数中,括号里面包括了格式说明和输出表列两部分,其中的格式说明用双引号引起来,两 者用逗号分隔开来,这里的逗号一定不能丢掉。但是好多学生容易忘记逗号,所以调试时候 老出现程序错误。对于格式说明部分来说,每个参数的格式说明之间既可以用空格隔开,又 可以用逗号隔开,也可以放在一起(一般需要隔开),最后输出的结果和用的分隔符号是一