《程序员面试宝典》精华 编程语言部分
- 正所谓取其精华,去其糟粕。本文谨记录下《程序员面试宝典》一些关键的知识点、易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录。当然这里的糟粕只是指不那么重要,或者比较简单,并不是说书写的不好。希望以后回顾时无需再看此书,只看保留在文中的精华即可。
- 文中有少许bug,亦摘录在此。
- 本文专注编程语言部分,包括第五章到第九章的内容
第五章 语言细节
- 5.1
y = z = 5
,等号先计算右边,返回值是赋值后的左边的变量值 - 5.1 printf函数中的表达式从右向左压栈,应该先计算右方的值
- 5.4 float型1.0f在内存中表示为:0x3f 80 00 00
- 5.5 出现int常数的表达式中的变量通常都要提升至int型
- 5.5 赋值运算符默认从右向左结合,也就是先计算右方的值
- 5.5 (x&y) + ((x^y)>>1)效果是取二者的平均数
- 5.6 不用判断和switch语句求a、b中的较大的一个:((a + b) + abs(a - b)) / 2
- 5.7
extern "C"
的用法:函数声明前添加,解决C/C++编译器的名字包装的不同问题
第六章 预处理、const和sizeof
- 6.1 求结构体中某成员的偏移量:
#define FIND(struc, e) (size_t)&(((struc *)0)->e)
- 6.2 C语言中,
const n = 10; char carray[n]
是错误的,因为C编译器不能把const看成编译期的常量。但实验得出是正确的,bug - 6.3 C++中给类成员变量添加mutable修饰符,就可以使用const函数修改
- 6.3 结构体对齐原则:结构体长度一定是最长数据元素整数倍,但如果大于处理器位数,则以处理器位数为对齐单位。CPU数据对齐原则是数据的内存地址必须是该数据长度的整数倍,以提高运行速度
- 6.3 sizeof(string) == 4
- 6.3 空类以及(多重)继承的空类大小都为1,但虚继承的类含有虚表指针,大小为4
第七章 指针与引用
- 7.1 指针与引用的区别
- 引用总是非空的,指针可能为空,使用时要小心测试
- 引用不可以指向另一个对象,但指针可以更改
- 7.1
int *p; *p = 0;
是错误的,指针p并未指向某个实际的地址 - 7.2
char a[] = "a"
数组存放中栈中,函数返回即消失,char *a = "a"
数组存放于全局只读数据段 - 7.2 若类B继承类A,两者皆有成员变量,A中有f方法,则
B b; b.f()
调用的是A中的f,f使用的变量也为A中的变量 - 7.3 指向const的指针应该是
const int *
,bug - 7.3
int ( *(*f)(int, int) )(int)
定义了一个函数指针,接收两个int参数,返回值为一个函数指针 - 7.4 指向整型数组的指针声明为:
int (*p) []
,指向整型的指针数组声明为:int *p[]
,函数指针的数组的声明:int (*p[10])(int)
- 7.5 悬浮指针指的是delete之后的指针,应该让指针等于0,使得后续程序使用此悬浮指针出错是可控的。比如第二次delete
- 7.5 new/delete与malloc/free的区别
- 前者是运算符,后者是函数
- 前者除了后者申请与释放动态内存的工作之外,对于非内置类型,还完成类初始化与析构操作
- 7.6 autoptr中拷贝时会尝试只保留一份指针,因此不适合放在容器中
第九章 STL模板与容器
- 9.1 如果没有重载拷贝构造函数为深拷贝,而又包含指针,那么调用拷贝构造函数时会复制指针,造成同一个指针 delete多次