求职面试---复习笔记1
1、字节对齐的细节与编译器相关,但一般而言,满足以下三个准则:
(1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除。(由于结构体的成员可以是复合类型,所以寻找最宽基本类型成员时,应当包括复合类型成员的子成员)
(2)结构体每个成员相对于结构体首地址的偏移量(offset)都是该成员大小的整数倍,如有需要编译器会在成员之间加上填充字节。(确定复合类型成员的偏移位置时,则是将复合类型成员作为整体对待)
(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后填充字节。
2、#define有哪些缺陷
(1)无法进行类型检查
(2)由于运算符优先级不同,使用宏的时候容易出现问题。确保的方法是所有的都加括号,例如#define ADD(a+b) a+b 应该写为#define ADD(a+b) ((a)+(b))
(3)无法单步调试
(4)会导致代码膨胀
(5)C++中,使用宏无法操作类的私有数据成员
3、常用宏,比较大小、两数的最大值、两数的最小值
(1)#define MAX(a,b) (fabs((a)-(b))==((a)-(b))?(a):(b))
(2)#define MIN(a,b) ((a) <= (b) ? (a):(b))
4、如何判断一个变量是有符号数还是无符号数,有三种方法
(1)采取取反操作
(2)利用无符号数和有符号数相减的结果为无符号数这一特性
(3)通过改变符号位判断。
5、#define TRACE(S) (printf("%s\n",#S),S)是什么意思?
#进行宏字符串连接,在宏中把参数解释为字符串,不可以在语句中直接使用。
#include <iostream>
using namespace std;
#define TRACE3(S)(printf("%s\n",#S),S)
int main()
{
int a = 5;
int b = TRACE3(a);
cout << b <<endl;
const char *str = "hello";
char des[50];
strcpy(des,TRACE3(str));
printf("%s\n",des);
return 0;
}
6、JAVA抽象类和接口的区别:点击打开链接
关键句:抽象类表示“is a”的意图,接口表示“like a ”的意图~
语法层面:抽象类不可实例化
7、异或运算的性质:任何一个数字异或它自己都等于0。
例子:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只有一次的数字。要求时间复杂度是O(n),空间复杂度为O(1)。
8、如何使用宏求结构体的内存偏移地址?
#define Offset(type,field) ((size_t)&((type*)0->field))
9、如何使用宏求数组中有多少个元素?
sizeof(array)/sizeof(array[0])
10、如果不用sizeof,如何求int占用的字节数??
#define MySizeof(Value) ((char*)(&Value+1)-(char*)(&Value))