高级c语言_笔记

上传人:子 文档编号:43486522 上传时间:2018-06-06 格式:DOC 页数:10 大小:36KB
返回 下载 相关 举报
高级c语言_笔记_第1页
第1页 / 共10页
高级c语言_笔记_第2页
第2页 / 共10页
高级c语言_笔记_第3页
第3页 / 共10页
高级c语言_笔记_第4页
第4页 / 共10页
高级c语言_笔记_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《高级c语言_笔记》由会员分享,可在线阅读,更多相关《高级c语言_笔记(10页珍藏版)》请在金锄头文库上搜索。

1、高级高级 C C 语言语言_ _笔记笔记1.巧用 do.while(0).2.位运算的妙用:(1) 奇偶判定:(a(8)判断一个整数是不是 2 的幂,对于一个数 x = 0,判断他是不是2 的幂boolean power2(int x)return (xy = x;x = y;(10)计算绝对值int abs( int x )int y ;y = x 31 ;return (xy)-y ; /or: (x+y)y(11)取模运算转化成位运算 (在不产生溢出的情况下)a % (2n) 等价于 a else x= a;等价于 x= a b x;(16) x 的 相反数 表示为 (x+1)3.不经意

2、的死循环:int main()int i,j8;for(i=0;i低地址i,j7,j6,j5,j4,j3,j2,j1,j0如果在 int i,j8后面再定义变量 int c,那么 c 就存放在 j0的往低方向的下一个地址 0xbfdab058 .当然,也有可能由低地址向高地址存储,若 int j8,i;同样会有死循环出现,总之,一定要注意访问越界的情况.另一个例子:#include int main()int i;char c;for(i=0;i 25!x!+!a!a!b!+!*!b!+!*后缀表达式求值的算法是:从表达式字符串中逐个读取(不妨假定每个操作数就是一个字符) ,若遇操作数,则将其

3、压入一个 stack中;若遇操作符(指=,-,*,/),则取 stack 的栈顶元素为操作符的后一个操作数,栈顶的下一个元素为操作符的前一个操作数;若遇到终止符,则结束运算,若 stack 只有一个元素,其为所求值,反之则出错。思考:对-1-2 如何计算?7.结构体对齐的具体含义:#pragmapack 规定的对齐长度,实际使用的规则是:结构,联合,或者类的数据成员,第一个放在偏移为 0 的地方,以后每个数据成员的对齐,按照#pragmapack 指定的数值和这个数据成员自身长度中,比较小的那个进行。也就是说,当#pragmapack 的值等于或超过所有数据成员长度的时候,这个值的大小将不产生

4、任何效果。而结构整体的对齐,则按照结构体中最大的数据成员和 mapack 指定值 之间,较小的那个进行。具体解释#pragmapack(4)class TestBpublic:int aa; /第一个成员,放在0,3偏移的位置,char a; /第二个成员,自身长为 1,#pragmapack(4),取小值,也就是 1,所以这个成员按一字节对齐,放在偏移4的位置。short b; /第三个成员,自身长 2,#pragmapack(4),取 2,按 2 字节对齐,所以放在偏移6,7的位置。char c; /第四个,自身长为 1,放在8的位置。;这个类实际占据的内存空间是 9 字节类之间的对齐,是

5、按照类内部最大的成员的长度,和#pragmapack规定的值之中较小的一个对齐的。所以这个例子中,类之间对齐的长度是 min(sizeof(int),4),也就是 4。9 按照 4 字节圆整的结果是 12,所以 sizeof(TestB)是 12。如果#pragmapack(2)class TestBpublic:int aa; /第一个成员,放在0,3偏移的位置,char a; /第二个成员,自身长为 1,#pragmapack(2),取小值,也就是 1,所以这个成员按一字节对齐,放在偏移4的位置。short b; /第三个成员,自身长 2,#pragmapack(2),取2,按 2 字节对

6、齐,所以放在偏移6,7的位置。char c; /第四个,自身长为 1,放在8的位置。;/可以看出,上面的位置完全没有变化,只是类之间改为按 2 字节对齐,9 按 2 圆整的结果是 10。/所以 sizeof(TestB)是 10。现在去掉第一个成员变量为如下代码:#pragmapack(4)class TestCpublic:char a;/第一个成员,放在0偏移的位置,short b;/第二个成员,自身长 2,#pragmapack(4),取 2,按 2 字节对齐,所以放在偏移2,3的位置。char c;/第三个,自身长为 1,放在4的位置。;/整个类的大小是 5 字节,按照 min(siz

7、eof(short),4)字节对齐,也就是 2 字节对齐,结果是 6/所以 sizeof(TestC)是 6。另外,使用位域的主要目的是压缩存储,其大致规则为:1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof 大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof 大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6 采取不压缩方式,Dev-C+采取压缩方式;4) 如果位域字段之间穿插着非位域字段,则不进行压缩;5)

8、 整个结构体的总大小为最宽基本类型成员大小的整数倍。8.常见误区:1) void main() 应该是 int main();2) 误用 fflush(stdin)来清空缓冲区,它在很多环境下是没定义的;3) 强制转换 malloc() 的返回值,因为 void*(泛型指针)的出现,对其进行强制转换是不必要的,甚至会带来不必要的麻烦,类似地,使用calloc ,realloc 等返回值时亦不需对其进行类型转换;4) char c = getchar();习惯用 char 型变量接收 getchar、getc,fgetc 等函数的返回值,其实这么做是不对的,并且隐含着足以致命的错误。getcha

9、r 等函数的返回值类型都是 int 型,当这些函数读取出错或者读完文件后,会返回 EOF。EOF 是一个宏,标准规定它的值必须是一个 int 型的负数常量。通常编译器都会把 EOF 定义为 -1。问题就出在这里,使用 char 型变量接收 getchar 等函数的返回值会导致对 EOF 的辨认出错,或者错把好的数据误认为是 EOF,或者把 EOF 误认为是好的数据。例如:char c; /假设编译器默认 char 为 unsigned charFILE *fp;.while (c = fgetc(fp) != EOF )putchar(c);这将是一个死循环,因为 c 升级为 int 时,FF

10、 00 00 00 FF。若定义 signde char c;(c = fgetc(fp) != EOF? /* 读到值为 FF 的字符,误认为 EOF */此时,当文件未读完时,循环已中断;9.关于 while(1)和 for(/*?可以有代码 */;?/*?必须为空 */;?/*?可以有代码 */)的效率问题,因为前者总会判断 1 的真假性,而后者无条件循环,故后者优于前者;10.产生随机数的方法:1)产生一定范围内的随机数:直接方法:rand() % N;由于许多随机数发生器的低位比特并不随机。一个较好的方法是:(int)(double)rand() / (double)RAND_MAX

11、 + 1) * N);如果你不希望使用 double,另一个方法是:rand() / (RAND_MAX / N + 1);2) 为什么每次执行程序,rand() 都返回相同顺序的数字?你可以调用 srand() 来初始化伪随机数发生器的种子,传递给 srand() 的值应该是真正的随机数,例如当前时间:#include#includesrand(unsigned int)time(time_t *)NULL);请注意,在一个程序执行中多次调用 srand() 并不见得有帮助!不要为了取得“真随机数”而在每次调用? rand() 前都调用 srand()!11.C 语言中的指针和内存泄漏:(1

12、)未初始化的内存;(2)内存覆盖;(3)内存读取越界;(4)内存泄漏:在对指针赋值前,请确保内存位置不会变为孤立的。另外,在释放内存时,每当释放结构化的元素,而该元素又包含指向动态分配的内存位置的指针时,应首先遍历子内存位置,并从那里开始释放,然后再遍历回父节点。(5)返回值的不正确处理,比如:char *func() return (char*)malloc20; void callingFunc ( ) func(); (6)始终要跟踪所有内存分配,并在任何适当的时候释放它们;(7)访问空指针:访问空指针是非常危险的,因为它可能使您的程序崩溃。始终要确保您不是在访问空指针。总结:始终结合使用 memset 和 malloc,或始终使用 calloc。每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。在对指针赋值前,要确保没有内存位置会变为孤立的。每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应首先遍历子内存位置并从那里开始释放,然后再遍历回父节点。始终正确处理返回动态分配的内存引用的函数返回值。每个 malloc 都要有一个对应的 free。确保您不是在访问空指针。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号