求职面试---复习笔记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 ",#S),S)是什么意思?

#进行宏字符串连接,在宏中把参数解释为字符串,不可以在语句中直接使用。

#include <iostream>
using namespace std;

#define TRACE3(S)(printf("%s
",#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
",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))


原文地址:https://www.cnblogs.com/javaadu/p/11742647.html