c语言中常出现问题详解

c语言中常出现问题详解

ID:8894232

大小:29.00 KB

页数:8页

时间:2018-04-10

c语言中常出现问题详解_第1页
c语言中常出现问题详解_第2页
c语言中常出现问题详解_第3页
c语言中常出现问题详解_第4页
c语言中常出现问题详解_第5页
资源描述:

《c语言中常出现问题详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C语言中.h的意思与用途作为一般规则,你应该把这些东西放入头(.h)文件中:2宏定义(预处理#defines)2结构、联合和枚举声明2typedef声明2外部函数声明(参见问题1.4)2全局变量声明当声明或定义需要在多个文件中共享时,尤其需要把它们放入头文件中。特别是,永远不要把外部函数原型放到.c文件中。参见问题1.3。另一方面,如果定义或声明为一个.c文件私有,则最好留在.c文件中。参见问题1.3和10.5。参考资料:[K&R2,Sec.4.5pp.81-2];[H&S,Sec.9.2.3p.267];[CT&P,Sec.一个头

2、文件可以包含另一头文件吗?这是个风格问题,因此有不少的争论。很多人认为“嵌套包含文件”应该避免:盛名远播的“印第安山风格指南”(IndianHillStyleGuide,参见问题17.7)对此嗤之以鼻;它让相关定义更难找到;如果一个文件被包含了两次,它会导致重复定义错误;同时他会令makefile的人工维护十分困难。另一方面,它使模块化使用头文件成为一种可能(一个头文件可以包含它所需要的一切,而不是让每个源文件都包含需要的头文件);类似grep的工具(或tags文件)使搜索定义十分容易,无论它在哪里;一种流行的头文件定义技巧是:#i

3、fndefHFILENAME_USED#defineHFILENAME_USED...头文件内容...#endif每一个头文件都使用了一个独一无二的宏名。这令头文件可自我识别,以便可以安全的多次包含;而自动Makefile维护工具(无论如何,在大型项目中都是必不可少的)可以很容易的处理嵌套包含文件的依赖问题。参见问题17.8我如何用#if表达式来判断机器是高字节在前还是低字节在前?恐怕你不能。(预处理运算仅仅使用长整型,而且没有寻址的概念。)你是否真的需要明确知道机器的字节顺序呢?通常写出与字节顺序无关的代码更好。为什么声明exte

4、rnintf(structx*p);报出了一个奇怪的警告信息“结构x在参数列表中声明”?与C语言通常的作用范围规则大相径庭的是,在原型中第一次声明(甚至提到)的结构不能和同一源文件中的其它结构兼容,它在原型的结束出就超出了作用范围。要解决这个问题,在同一源文件的原型之前放上这样的声明:structx;它在文件范围内提供了一个不完整的结构x的声明,这样,后续的用到结构x的声明至少能够确定它们引用的是同一个结构x。11.23a[3]="abc";合法吗?它是什么意思?尽管只在极其有限的环境下有用,可它在ANSIC(可能也包括一些ANSI

5、之前的系统)中是合法的。它声明了一个长度为3的数组,把它的三个字符初始化为’a’,’b’和’c’,但却没有通常的’’字符。因此该数组并不是一个真正的C字符串从而不能用在strcpy,printf%s等当中。多数时候,你应该让编译器计算数组初始化的初始值个数,在初始值“abc”中,计算得长度当然应该是4。参考资料:[ISO,Sec.6.5.7为什么这些代码doubled;scanf("%f",&d);不行?跟printf()不同,scanf()用%lf代表双精度数,用%f代表浮点数。怎样在scanf()格式串中指定可变的宽度?不能

6、:scanf()格式串中的星号表示禁止赋值。你可以使用ANSI的字符串化和字符连接完成同样的事情,或者你可以在运行时创建scanf格式串。12.15当我用“%d”调用scanf从键盘读取数字的时候,好像要多输入一行函数才返回。可能令人吃惊,nn在scanf格式串中不表示等待换行符,而是读取并放弃所有的空白字符。参见问题12.18。参考资料:[K&R2,Sec.B1.3pp.我用scanf%d读取一个数字,然后再用gets()读取字符串,但是编译器好像跳过了gets()调用!scanf%d不处理结尾的换行符。如果输入的数字后边紧接

7、着一个换行符,则换行符会被gets()处理。作为一个一般规则,你不能混用scanf()和gets(),或任何其它的输入例程的调用;scanf对换行符的特殊处理几乎一定会带来问题。要么就用scanf()处理所有的输入,要么干脆不用。数组和下标在C语言中可以互换。这个奇怪的事实来自数组下标的指针定义,即对于任何两个表达式a和e,只要其中一个是指针表达式而另一个为整数,则a[e]和*((a)+(e))完全一样。这种交换性在许多C语言的书中被看作值得骄傲的东西,但是它除了在混乱C语言竞赛之外,其实鲜有用武之地。有个灵巧的窍门:如果我这样写i

8、ntrealarray[10];int*array=&realarray[-1];我就可以把“array”当作下标从1开始的数组。尽管这种技术颇有吸引力(而且在《NumericalRecipesinC》一书的旧版中使用过),它却不完全

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。