1. 统计x转化为2进制后1的个数
int count = 0;while(x){count++;x = x&(x-1)}
2. 逻辑表达式的短路效应,仅限于各个逻辑分式。(?)
3. printf 参数是从右向左压栈的,先计算最右边的表达式。
- 如:printf("%d %d", *ptr, *(++ptr)), 先计算++prt
4. 两种不同的强制转换
- (int &)a, 将a变量的地址开始的 sizeof(int) 个字节按照 int 取出。(a本身存储的是数据)
- (int)a, 将a变量的内容强制转换为int型后,取出,a变量本身并没有被改变。
- 强制类型转换会发生字节截断:unsigned char b = (unsigned char) a;
- 强制转换指针类型,不会对数据造成影响:unsigned char * b = (unsigned char *) &a;
5. 默认类型转换原则:
- 转换为表达式中最宽类型
- 转换为程序“暗示出”的类型(参数类型、返回值类型)
- 若表达式中所有元素均为整型(short,int),则统一转换为int
6. 运算优先级:
- 从属性操作和括号
- 取非、取反、自增
- 取地址,取内容
- 算术运算
- 移位运算,比较
- 位运算,逻辑运算
- 各类赋值
7. 内存对齐原则:
- 起始地址为最大基本类型成员大小的整数倍(一般不用考虑,认为从0开始)
- 各个基本类型成员起始地址为自己长度的整数倍
- 整个结构体长度为最大基本成员长度的整数倍
- 结构体嵌套时,拆分为基本成员进行处理
- 1,3规则为windows规则,在linux系统下,均为4
- #progma pack(int), 可设置整体对其基准
- class中,仅包含非static变量(static 存储在数据区)
- 当存在位域时候的对齐原则:
- 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
- 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;(经测试此条好像仅限于char型,整型可以跨域存储)
- 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
- 如果位域字段之间穿插着非位域字段,则不进行压缩;
- 整个结构体的总大小依然为最宽基本类型成员大小的整数倍。
8. 基础类型大小:
char、bool short long、int float long long、double
1 2 4 4 8
9. 内存结构:
- 栈:局部变量、参数传递、函数调用
- 堆:动态分配
- 数据区:全局、静态、常量
- 代码区:代码
10. 运算符问题:
- 判断是否为2的次方:减1相与,为0则是2的次方
- x&y:位与,x,y相同位的一半
- x|y: 位或
- x^y: 异或,异则相或,取x和y的不同位
- 取出a、b中较大的: ( (a+b) + abs(a-b) ) / 2
- 交换a,b: a = a^b, b = a^b, a = a^b
11. extern "c":C++支持重载,重载函数编译后会加上一些内容使得编译后的名称不同。