版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计中疑难问题的探讨摘要:结合笔者的教学经验,介绍了C语言程序设计中遇到的一些常见疑难问题及解决方法,其中涉及到变量的类型和定义,自增自减运算,输入输出函数,循环结构,数组作为参数传递、指针无所指等方面的问题。关键词:变量;C语言;循环结构;数组;指针0引言C语言程序设计是一门专业基础课,是数据结构、数学建模、操作系统等课程的前导课程,也是一门实践性很强的课程,既要掌握概念,又要动手编程,还要上机调试运行。对计算机专业和理工类专业来说是一门必修的课程,是软件开发人员必须掌握的一种语言,其学习和使用的人越来越多。本人在这几年的C语言教学过程中积累了一些经验,现就对C语言程序设计中的一些
2、常见疑难问题进行探讨。1变量的类型和定义1.1注意正确定义变量的数据类型一方面,初学者经常忘记变量必须“先定义,后使用”,往往在编译调试时发现出错;另一方面,定义变量时,往往忽略了数据范围,而选择了不合适的数据类型。例:求120的阶乘之和s。程序如下:main()intf=1,n,s=0;for(n=1;n<=20;n+)f=f*n;s=s+f:printf("%d,",s);此程序在语法和逻辑上都没错误,可上机运行结果就是不对。看看这个数据定义,我们就发现int的表示范围是:-3276832767,可见从8!起结果就超出这个范围,故得不到正确结果,需要将f,s定义成
3、:floatf,s;这样即可得到正确结果了。1.2避免对变量进行非法运算C语言运算符丰富,不同的运算符有不同的数据要求,初学者往往忽略这一点。例:floata=3.4,b=2.1;printf("%d",a%b);岂不知忽略了“%”求余运算两侧只能是整型数据,此处a%b为非法表达式。2自增、自减运算符的灵活运用C语言中,+、-的运用非常灵活,执行效率高,但在使用时必须注意以下几点:(1) +、-只能作用于变量,不能表达式或常量例:+xy-都是合法表达式+(x+y)5-都是非法表达式(2) 注意+、-在变量中的应用位置是前置还是后置例:inti=4;printf("
4、%d",i+);执行结果为4,i的值为5,是先输出再自增,因为是+后置;inti=4;printf("%d",+i);执行结果为5,i的值为5,是先自增再输出,因为是+前置;(3) +、-的结合方向为右结合例:inti=4;printf("%d",-i+);执行结果为-4,i的值为5,不是-5,因为-i+相当于-(i+)。(4) 有关表达式使用中的一些异议情况例:inti=1;表达式(i+)+(i+)+(i+)结果为3,i的值为4;表达式(+i)+(+i)+(+i)结果为12,i的值为4;表达式(+i)+(i+)+(i+)结果为6,i的值为4;
5、由此可见,C语言同一个表达式中出现前置后置运算符时,系统先执行前置运算符,把得出来的值作为表达式中所有该变量的值,计算出表达式的结果,最后执行后置运算符,得到对应的变量值,即在优先级上是:+i>i>i+,-也如此。3使用输入输出函数时易产生的错误3.1注意scanf()和printf()中的三种字符(1)普通字符:原样输入和输出;(2)格式控制字符以“%”打头,与变量或表达式的数量和类型一一对应;seanf("a=%d,b=%d",&a,&b);如要输入4,4时,应这样输入:a=4,b=5,不能随意地输入45,或4回车5。printf("
6、;a=%dnb=%d",a,b);结果为:a=4b=53.2注意seanf()和getchar()留下的垃圾seanf()和getchar()在接收数据输入时都可以回车结束,在回车前用户可能输入很多数据,但函数仅取走其所需要的,其余的多余数据仍在缓冲区中,留给以后的函数,这样,极有可能产生错误。另外,即使数据没多余,这两函数也会在缓冲区中留下一个'n'字符,如:seanf("%d",&i);eh=getehar();printf("%d%e",i,eh);当输入4回车时,4->i,回车->ch,说明seanf
7、()并没取走'n',而是留给了getchar()。4循环结构中的一些常见问题(1)误将赋值运算符=作为比较运算符=例:inti=1;while(i=10),此为无限循环,因为i赋成10,为永真条件。而while(i=10),此循环一次也不执行,因为i不等于10,条件一开始就不成立,从而一次不做。(2)循环语句中的死循环例:for(i=1;i+)printf("%d",i);无条件限制;inti=1;while(i<10)printf("%d",i);无修改循环变量的语句,条件永远成立,产生死循环。(3)循环体模糊(花括号放错位置)复
8、合语句作为循环体时,需要用门括出,如果没有,循环体仅为一条语句,见例:for(i=0;i<=10;i+)printf("*");printf("n");此时输出一行10个*;如改成这样:printf("*");printf("n");此时输出10行,每行1个*。此情况尤其在循环嵌套中更为严重。(4)忽略空语句例:要输出1100for(i=1;i<=100;i+);printf("%d",i);结果输出一个101,其原因就是循环仅是一条空语句,真正的输出语句不是循环体。5数组名作为函数
9、实参传递为“地址传递”我们知道,C语言中“值传递”是单向传递,只由实参传给形参,而不能由形参传给实参,而在用数组名作为实际参数传递时,如下程序:main()intf(intb,n)inta10;f(a,10);此时,实参数组a并不是把数组元素的值传给形参数组b,而是把实参数组a的起始地址传给形参,这样两个数组就共占同一段内存,也就是f()的操作会影响数组a,实现地址的传递。6指针的无所指现象指针变量也需要先定义后使用,并且只能存放地址,应该先给它定位,即先指向某一内存单元,否则可能导致严重后果,如下例:inta,*p;scanf("%d",p);或*p=20;printf("%d",*p);指针p的值不确定,随机指向某个地址,则所赋值就送入这个随机单元,将该单元数据覆盖,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版慢性胆囊炎病症状剖析及护理指南
- 券商机构业务介绍
- 肺部的护理宣教
- 胶东避暑山庄介绍
- 新斯的明药品介绍
- 2025版癫痫常见症状及护理技巧分享
- 2025版关节炎常见症状及护理要领
- 种植牙种前介绍
- 预算的编制方法与程序
- 三方协议书要签多久
- 测绘服务投标方案(技术标)
- 医院感染与标准预防措施
- 《供应链管理培训资料》课件
- DB34∕T 4161-2022 全过程工程咨询服务管理规程
- 2025年执业药师考试药学专业知识一 药物化学基础入门篇
- 蒸汽管道安装施工方案
- 《课程理论-课程的基础、原理与问题》施良方
- 4.2.1指数函数及其图像与性质省公开课获奖课件说课比赛一等奖课件
- 全国一等奖人音版一年级音乐上册《口哨与小狗》课件
- JT∕T 1477-2023 系列2集装箱 角件
- 临床技术操作规范骨科分册
评论
0/150
提交评论