- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言教学中的几个常见问题 文章编号:1672-5913(2009)10-0096-03 摘要:作者在多年的C语言教学过程中,对学生中经常遇到的问题进行了一些总结。本文就学生中经常遇到的5个带有普遍性的问题,通过C程序示例进行了分析,指出了出现错误的原因,给出了改正的方法。 关键词:C语言;程序设计;教学 中图分类号:G642 文献标识码:B 1引言 随着计算机应用技术的普及,大学中很多专业都开设了计算机编程课程。在非计算机专业中,大多以教授C语言编程为主。本人长期从事对非计算机专业学生的C语言编程课的教学工作,在长期的教学实践中,发现了一些学生在编程中经常会遇到的问题。在此,就几个典型的常见问题,展开一些探讨。这些问题的解决,对于更深入的理解C语言,将起到一定的帮助作用。 2几个常见问题 2.1无符号数运算问题 大家知道,在C语言中,不同类型的数据一起运算时是按照隐式类型转换的规则进行的,也就是将两个类型不一致的数据首先转换成一致的,然后再进行运算。其转换的基本原则有两点,一是小数据类型向大数据类型转换,二是有符号类型向无符号类型转换。比如,当一个float类型数据和一个double类型的数据进行运算时,就是首先将float类型的数据转换成double类型的数据,然后再进行运算;而当一个int类型的数据和一个unsigned int类型的数据进行运算时,则首先把int类型的数据转换为unsigned int类型的数据,然后再进行运算。对于第一种情况,一般不会遇到问题,但是对于第二种情况,初学者往往注意不到这种转换中可能会隐含的问题,导致程序运行结果出现与自己设想不一致的情况。 下面给一个具体的例子: #include int main() { unsigned int n = 1; int m = -1; if (m n)printf(m n); else printf(m = n); return 1; } 在这段程序中,n = 1,m = -1,显然应该是m= n。初学者遇到这种情况,往往百思不得其解,最终往往会归咎于是不是系统出现了问题。 为什么会出现这种情况呢?这是因为n是unsigned int类型的,而m是int类型的,在m和n进行比较运算时,由于二者的类型不一致,首先要进行类型转换。按照C语言隐式类型转换规则,有符号类型的int转换为无符号类型的unsigned int。这样,m(=-1)中的符号位被当成了“数字”进行转换,有符号的-1成为了无符号的4294967295(四字节的情况下。如果是二字节的则是65535)。而4294967295当然要大于1了,所以就有了以上的运行结果。 不单单是在比较运算中会出现这种情况,在其他运算中,比如加减乘除等,也一样会有类似的情况出现。所以,当有符号和无符号的数据混合运算时,一定要注意这个问题,除非特殊情况,应尽量避免有符号和无符号的混合运算。 2.2计算数组的长度 在C语言中,操作符sizeof( )可以计算一个类型或者一个变量所占用的字节数。比如:sizeof(int)或者sizeof(x)(假定x是int类型的),当一个整数占用4个字节时,就可以得到4的结果。 再比如,一个整数数组:int a[8]; 可以通过sizeof(a)/sizeof(int)得到数组a的元素个数。因为sizeof(a)得到的是a数组占用的总字节数,除以每个int所占用的字节数sizeof(int),就是该数组的长度。 由于很多情况下需要知道一个数组的长度,比如在对一个数组排序时,因此,有些初学者就利用sizeof在函数中计算数组的长度。举例如下: mysort(int a[]) { int len; len = sizeof(a)/sizeof(int); //得到数组a的长度 //以下对a进行排序 } 但是往往会发现,这样的结果并不正确,len经常得到的是1(假定是32位系统,一个整数占4个字节)。这又是为什么呢? 这个问题,与C语言中数组参数的传递方式有关。在C语言中,当一个数组当作参数传递时,数组被转换为指针。在上面的例子中,无论你在函数定义是mysort(int a[])还是mysort(int a[100]),在函数内部,a均被转换成int *a类型,与定义mysort(int *a)是一致的。因此,在函数内部,当计算sizeof(a)时,实际上计算的是sizeof(int *)。因此,当作为形参时,无论你的mysor
有哪些信誉好的足球投注网站
文档评论(0)