获《C语言常见问题集》源自bjbs_270博文“分享C语言常见问题集”。下载此书后觉得此书中讲的许多问题值得一观,加上有时间的便利便决定将其通看一篇。我将《C语言常见问题集》上传到了CSDN。[2014.6.13-:0:00]
关于数据的转换可查看笔记:[C]数据的转换。[2014.6.14-21:59]
最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。
永远不要把外部函数的原型放到.c 文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型比不用还糟糕。
对于初始化来说, 数组和结构都被认为是“变量”(静态,栈,堆)。
char*p = "string literal";中的字符串可能会存储在只读内存中, 这就是造成它不一定能被修改。
简单的按字节比较会由于结构中没有用到的“空洞”中的随机数据而失败; 而按域比较在处理大结构时需要难以接受的大量重复代码。如果你需要比较两个结构, 你必须自己写函数按域比较。
一个变量在同一表达式的其它地方被引用, 这会导致无定义的结果,如a[i] = i++;
没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式“完成” (按照ANSI C 的术语, 在下一个“序列点”之前) 之前的某个时刻进行。
f() + g() * h()尽管我们知道乘法运算在加法之前, 但这并不能说明这三个函数哪个会被首先调用。
C 中没有一般的指针的指针类型。void* 可以用作一般指针只是因为当它和其它类型相互赋值的时候, 如果需要, 它可以自动转换成其它类型; 但是, 如果试图这样转换所指类型为void* 4E4B外的类型的void** 指针时, 这个转换不能完成。
根据语言定义, 在指针上下文中的常数0 会在编译时转换为空指针。然而, 传入函数的参数不一定被当作指针环境, 因而编译器可能不能识别未加修饰的0 “表示” 指针。特别是,在函数调用的参数里, NULL之前(正如在0之前)的类型转换还是需要。当程序员请求一个空指针时, 无论写“0”还是“NULL”, 都是有编译器来生成适合机器的空指针的二进制表达形式。因此, 在空指针的内部表达不为0 的机器上定义NULL 为0 跟在其它机器上一样合法。
指针和数组访问元素的区别在于数组和指针一旦在表达式中出现就会按照不同的方法计算, 不论它们是否有下标。指针和数组等价:数组和指针的算法定义可以用指针方便的访问数组或者模拟数组。指针算术只有在指针所指的内存块之内, 或者指向虚构的“终结”元素(如数组的最后一个元素)后的一个时才有定义。
预编译在编译过程的早期进行, 此时尚未对类型名称进行分析,所以sizeof不能用于#if 预编译指令中。
以下网址已验证,已找到相关资源,部分资源上传到了CSDN服务器。
ANSI C 主要标准化了现存的实践, 同时增加了一些来自C++ 的内容(主要是函数原型) 并支持多国字符集(包括备受争议的三字符序列)。ANSI C 标准同时规定了C 运行期库例程的标准。
当使用到输入输出和库函数时一定要参考手册。输入输出的基础知识也需要积累。
正则表达式或通配符匹配的代码:有许多匹配正则表达式的包可以利用。很多包都是用成对的函数, 一个“编译”正则表达式, 另一个“执行”它, 即用它比较字符串。查查头文件
在库函数章节内,有一些问题可以当成一个题目来解决。
编码标准:
ftp://ftp.cs.washington.edu/:(更新的印第安山风格指南, (Indian Hill Guide))[没有找到pub/cstyle.tar.Z,在其它地方找到此文档上传到了CSDN,下载地址]
ftp://ftp.cs.washington.edu/:(包括Henry Spencer 的《C 程序员的十诫》(“10 Commandments for C Programmers”))[没有找到doc/programming]
ftp://ftp.cs.umd.edu/pub/style-guide/还可以找到,但c-style下无内容。
书本:《The Elements of Programming Style》[K&P],《C Style: Standards and Guidelines》[Straker]
工具列表:《C语言常见问题集》18.1章节。
C教程和资源:在http://cprog.tomsweb.net/ 有个Tom Torfs 的不错的教程[网址可用,2014.6.15]。
Christopher Sawtell 写的《给C 程序员的便筏》(Notes for C programmers)。在下面的地址可以得到:ftp://svr-ftp.eng.cam.ac.uk/misc/sawtell_C.shar(下载shar文件并压缩为sawtell_CLesson.zip),http://web.ift.uib.no/Fysisk/Teori/KURS/OTHER/newzealand.html。
Time Love 的《程序员的C》(C forProgrammers)。http://www-h.eng.cam 及
http://www-h.eng.cam.ac.uk/help/tpl/languages/C/teaching_C//。[网址可用2014.6.15]
本FAQ 的作者以前教授一些C 的课程, 这些笔记都放在了网上http://www.eskimo.com/~scs/cclass/cclass.html。[网址可用2014.6.15]
源代码实例供研究和学习:这里有几个连接可以参考: http://www.eskimo.com/∼scs/src/。[网址可用2014.6.15]
标准C 函数库的源代码:GNU工程有一个完全实现的C函数库(http://www.gnu.org/software/libc/)[网址可用2014.6.15]。另一个来源是由P.J. Plauger 写的书《The Standard C Library》
《C常见问题集》内有的问题可当作编程实践内容。面对那么多的C风格和资源,要进行选择,不要被弄晕了。[2014.6.15-13:26]
Book Note Over.