[原创] 程序员面试宝典:第五章 程序设计基本概念

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++支持重载,重载函数编译后会加上一些内容使得编译后的名称不同
 
原文地址:https://www.cnblogs.com/icemoon1987/p/2709567.html