`

C语言细节

    博客分类:
  • c++
 
阅读更多

参考:http://www.cnblogs.com/steven_oyj/archive/2010/06/02/1749658.html

基础问题

1、过分积极的注释

注释必须和代码一起维护,不应该描述显而易见的事,或把别的地方已说清楚的东西在说一遍。

2、幻数(字面常量)

字面常量没有语义,也没有真正的内存地址。

所以不可以取其地址,也不可以用于初始化普通引用,例如:long &r1 = 40000;

但是const long &r1 = 40000 却是合法的。

所以,尽量不要使用字面常量,而应该使用枚举常量和初始化过的常变量

3、全局变量

全局变量增加了模块间的耦合。

当全局变量(静态变量)用来初始化的值不能在编译时就计算妥当,则该初始化动作就会拖到运行期,这容易导致致命错误。可以使用单价模式解决这个问题

4、未能区分函数重载和形式参数默认值

函数重载主要用于一组抽象意义相同,但实现不同的函数。

而形式参数默认值主要出于简化,为函数提供更简洁的接口。

5、对引用的认识误区

(1)由于引用没有地址,声明引用的引用、指向引用的指针或引用的数组都是不合法的。

(2)引用不可以有常量性或挥发性,所以不可以用关键字const或volatile来修饰引用。

(3)任何能作为左值的复杂表达式都能作为引用的初始化物

(4)char *cp = reinterpret_cast<char *>(a); // 对cp取地址则错误
       reinterpret_cast<char *&>(a) = cp;// 正确,

(5)指向数组的引用保留了数组的尺寸信息,而指针则不保留(这个性质有时在数组名作为函数实参进行调用函数时使用)

(6)可以声明函数的引用:

ex: int f( double );

       int (* const pf) (double) = f; // pf是指向函数f()的常量指针

       int (&rf) (double) = f; // rf是函数f()的引用

可以把引用或函数本身(隐式)转换成指向函数的指针,再使用反引用语法。

6、对常量(性)的认识误区

(1)字母常量没有地址,永远不可以作左值

(2)int ci; const int *ip2 = &ci 的const只描述了通过ip2对ci的操作限制,而不是对ci的一般操作的限制。也就是说ci = 5可以,而*ip2 = 5不可以。

7、C语言的精妙之处

(1)如果?表达式中的两个选择结果都是左值,则该表达式本身就是个左值。

(2)case语句的标签必须是整形常量性的表达式(必须在编译时就要算出case中值)

8、区分可访问性和可见性

(1)要提供一个放置各种适当前置声明的专用头文件

(2)把class的接口与其实现分离,从而要达到真正的数据隐藏之境,而其不二法门则是运用桥接设计模式

(3)使用桥接,任何对于Class C实现的修改,只要不改变Class C的接口,影响就会被牢牢地钳制在一个单独的实现文件。

字符和字符串

1、strcat()只用来连接字符串,不可以使用字符作参数

2、C语言中字符用它们的字符集值对应的小整数表示,所以数字字符和它们对应的0-9的数字之间相互转换,加上或减去常数’0’即可

3、C语言中的字符常数是int型,因此sizeof(’a’)实际是sizeof(int),与C++不同的地方。

 

 

 

布尔表达式和变量

 

1、C语言中没有定义布尔变量,可以自己用宏去定义TRUE,FALSE为1,0。或者使用枚举enum bool{false, true};

2、一般不显示比较TRUE,FALSE

3、当P为指针,if(p)合法

 

 

 

宏与C预处理器

 

1、多语句宏的书写

     通常的目标是:书写一个像包含一个单独的函数调用语句的宏。

     这意味着:调用者需要提供最终的分号,而宏体则不需要。

     因此宏体不能为简单的括弧包围的复合语句,因为如果这样,调用的时候就会发生语法错(明显是一个单独语句,但却多了一个分号)。每行的最后用\连接

2、sizeof不能用于#if预编译器指令中,因为此时还未对类型名称作解析

3、m4工具是用于多用途的预处理器

4、参数个数可变的宏的书写

    一般用一个单独的用括弧括起来的”参数“定义和调用宏,参数在宏扩展的时候成为类似printf()那样的函数的整个参数列表。

    #define DEBUG(args) (printf(“DEBUG: ”), printf arg)

    if(n != 0) DEBUG((“n is %d\n”, n));

    明显缺陷是必须记住使用一对额外的括弧。

 

 

 

标准输入输出库

 

1、保存getchar()的返回值变量必须是int型

     getchar()可能返回任何字符,包括EOF

2、EOF通常对应键盘ctrl+z或ctrl+d

3、fgets()在遇到文件结束符时返回的是NULL

4、在输出需要显示的时候,最好明确调用fflush(stdout)调用

5、在printf中输出‘%’需要’%%’

6、printf的%f既可以输出float又可以输出double

7、printf(“%*d”, width, x)可以输出可变的域宽度 (width可是数字也可以是变量)

8、当s为已分配内存的字符串指针,可以用scanf(“%s”,s)对字符串进行

赋值

9、对double类型,必须是scanf(“lf”,&d)。不可以使用”f”

10、scanf %d不处理结尾的换行符

       所以若后面紧跟着fgets(),则换行符会被fgets()取走。所以不要混用scanf和fgets,或者专门在scanf后用一个getchar()来接换行符

11、gets()不能被告知输入缓冲区的大小,可能导致缓冲区溢出

12、ftell()和fseek()用长整形表示文件内的偏移(位置)。因此偏移量被限制在20亿(2的31次方-1)以内

13、读取二进制文件时应该使用“rb”调用fopen()

       文本/二进制区别只是发生在文件打开时,打开后,一切i/o函数相同

 

 

 

库函数

 

1、把数字转为字符串,使用sprintf。

     对整型使用%d,长整形为%ld,浮点型为%f。

2、strncpy()当目标串长度过小时,不能自动在尾部加上’\0’。

    但是当目标串长度过大时,会用多个’\0’填充。

    strcat就可以自动加’\0’

3、将字符转为大小写,有toupper()和tolower()

4、把字符串分隔成用空白作间隔符的段,可以使用strtok()

5、要使用处理正则表达式或通配符匹配的API,可以下载regexp库

6、库函数中有qsort(void *base, int nelem, int width, int (*fcmp)()),可以对数组进行快速排序

7、可以使用time(),ctime(),localtime()和strftime()就可以取得当前日期或时间。

 

 

 

浮点运算、可变参数

 

浮点运算

1、浮点数的保存与整数一样是通过二进制进行的

所以从十进制小数转成二进制再转回去就会不一样。

2、比较两个浮点数最好的方法就是利用一个精确地阈值

ex: if(fabs(a - b)) <= epsilon * fabs(a) )

 

可变参数

1、在printf()中,%f同时表示float和double

2、使用stdarg.h可以使用可变参数

使用次序必须是va_list, va_start(),va_arg(),va_end()

3、可以使用下列函数输出和输入可变参数

int vprintf(char *format, va_list param);

int vfprintf(FILE *stream, char *format, va_list param);

int vsprintf(char *string, char *format, va_list param);

int vscanf(char *format, va_list param);

int vsprintf(char *string, char *format, va_list param);

int vsscanf(char *s, char *format, va_list param);

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    c语言十大细节问题!

    文档中介绍了C语言在编写高质优效的程序时,需要注意到的若干细节问题。

    C语言细节笔记

    这是我个人以及在学C过程中做的笔记,仅供参考

    C语言改错练习资料(C常犯错误)

    C语言细节,针对常犯错误,从错误中吸取教训

    C语言编程细节分析 C语言 编程

    这个是关于C语言编程的小论文,主要讲述了C语言编程细节问题

    C/C++常见细节性笔试题

    如array(数组), tree(二叉树)等 另外包含一些常见C/C++考题的验证性实现,如Util,virtual 其中以Util.cpp, Virtual.cpp最有价值, Util包含一些细节性的笔试题目; Virtual则包含常见和虚函数相关...

    C语言代码细节分析.pdf

    C语言代码细节分析.pdf

    c语言要知道的495个问题

    深入学习c语言必备,讲述了有关c语言细节的问题。是学习c语言所要读的

    C语言深度解剖

    一本深度讲解C语言细节的书籍。作者用生动语言,形象的比喻为我们讲解C语言的细节,C语言常见的问题,也提及了一些操作系统,编译,调试等内容。

    关于c语言一些细节解剖

    有关c语言一些细节,函数,运算符,指针,数组等等

    你必须知道的495个C语言问题

    你必须知道的495个C语言问题图灵丛书全世界程序员智慧的结晶 全面解答C语言的疑难问题 涵盖了所有C语言细节问题 程序员必备

    C语言接口与实现

    本书概念清晰、内容新颖、实例详尽,是一本有关设计、实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南。...作者详细描述了24个接口和它们的实现细节,有助于 读者对这种设计方法的透彻理解。

    C语言中关于if语句中的小细节

    if语句都会用,但是有一些小细节并不容易被发现。下面就来说说C语言中关于if语句中的小细节。

    C语言重点知识总结梳理

    了解C语言更多细节: 7. C语言操作符 学习指针: 8. C语言指针初阶 学习结构体: 9. C语言结构体 C语言进阶: 数据的存储方式: 10. C语言整形的存储方式 11. C语言浮点型的存储方式 指针进阶: 12. C语言指针进阶 ...

    C语言参考手册原书第五版

    本书是经典C语言参考手册的最新版,在强调正确性、可移植性和可维护性的基础上,对C语言的具体细节、运行库以及C语言编程风格做了完整、准确的描述.  从20世纪90年代后期开始,C语言的地位逐渐受到它的“大哥”...

    C语言编程习惯和修养

    C语言的细节,有些地方说得还是挺有启发性的

    C语言学习资料合集.exe

    C语言学习资料合集,包含了C语言各个细节的讲解和编码实例,是学习C语言不可缺少的。

    C语言参考手册(译)

    这些练习的主要目的是帮助读者理解C语言的基本机制及其重要细节,其中并不涉及复杂的程序设计技术与问题。 本书可以作为高等院校计算机专业C语言课程的教材和参考书,对于一般的C程序员也有重要的参考价值。

    高职计算机专业C语言课程教学细节探讨.pdf

    高职计算机专业C语言课程教学细节探讨.pdf

    C语言难点分析整理!

    此外会包括一些细节、易错的地方。涉及的主要内容包括:变量的作用域和存储类别、函数、数组、字符串、指针、文件、链表等。一些最基本的概念在此就不多作解释了,仅希望能有只言片语给同是C语言初学者的学习和上机...

Global site tag (gtag.js) - Google Analytics