程序员面试宝典总共多少

学人智库 时间:2018-01-13 我要投稿
【www.unjs.com - 学人智库】

1. What will be the output of the following C code?

#include

int main(int argc, char* argv[])

{

int b=3;

int arr[] = {6, 7, 8, 9, 10};

int *ptr = arr;

*(ptr++) += 123;

printf("%d, %d ", *ptr, *(++ptr));

return 0;

}

2. 下面程序的结果是多少?

#include

int main(int argc, char* argv[])

{

unsigned char a = 0xA5;

unsigned char b = ~a>>4;

printf("b = %d ", b);

return 0;

}

3. 下面程序的结果是:

#include

int main(int argc, char* argv[])

{

unsigned int a = 0xFFFFFFF7;

unsigned char i = (unsigned char)a;

char * b = (char *)&a;

printf("%08x, %08x ", i, *b);

return 0;

}

4. 用一个表达式,判断一个数X是否为2的N次方(2,4,8,…),不可用循环语句。

5. 下面程序的结果是:

#include

#include

using namespace std;

int main(int argc, char* argv[])

{

int count = 0;

int m = 9999;

while(m){

count++;

m = m & (m - 1);

}

cout << count << endl;

return 0;

}

6. 不用判断语句,找出两个数中比较大的。

7. 如何将a、b的值交互,且不用任何中间变量。

8. 在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”?

9. 头文件中的ifndef/define/endif的作用? #pragma once的作用?

10. 结构体内存对齐问题。

11. 以下代码的输出是?

char var[10];

int test(char var[]){

return sizeof(var);

}

12. 写出下面程序的运行结果。

int a[3];

a[0] = 0; a[1] = 1; a[2] = 2;

int *p, *q;

p = a;

q = &a[2];

cout << a[q - p] << endl;

13. 解释下面这段代码:

int (*a)[10];

a++;

14. 以下程序的输出是:

int a[] = {1, 2, 3, 4, 5};

int *ptr = (int *)(&a + 1);

cout << *(a+1) << endl;

cout << *(ptr - 1) << endl;

15. 什么是智能指针?

16. Please write out the program output.

#include

#include

#define LOOP 1000

int main(int argc, char* argv[]){

int rgnC = 0;

srand((unsigned int)time(NULL));

for (int i=0; i<loop; p="" i++){<="">

int x = rand();

int y = rand();

if (x*x + y*y < RAND_MAX * RAND_MAX)

rgnC++;

}

printf("%d ", rgnC);

return 0;

}

17. 下面程序的输出结果是:

#include

#include

using namespace std;

class Base{

private:

int m_i;

int m_j;

public:

Base(int i):m_j(i), m_i(m_j){ }

Base():m_j(0), m_i(m_j){ }

int GetI(){ return m_i; }

int GetJ(){ return m_j; }

};

int main(int argc, char* argv[]){

Base base(98);

cout << base.GetI() << endl << base.GetJ() << endl;

return 0;

}

18. 请讲述Heap与Stack的差别。

19. 写一个字符串拷贝函数strcpy;为什么strcpy的返回值类型为char *。

20. 如何判断一个单向链表是否有环路?

21. 写出判断ABCD四个表达式的是否正确,若正确, 写出经过表达式中 a的值。

int a = 4;

(A)a += (a++); (B) a += (++a) ; (C) (a++) += a; (D) (++a) += (a++);

22. 下面程序的输出为:

union{

int i;

char x[2];

}a;

int main(int argc, char* argv[]){

a.x[0] = 10; a.x[1] = 1;

printf("%d ",a.i);

return 0;

}

1. 8,8 提示:C中的printf计算参数时是从右到做压栈的。

2. 245 提示:>>的优先级高于~,计算过程中,先将unsigned char转换为int,计算完后再转换为unsigned char。问题:为什么加括号不起作用。

3. 000000f7,fffffff7。

4. !(X&(X-1)) 提示:2、4、8、16这样的数转换成二进制是10、100、1000、10000。如果X减1后与X做与运算,答案若是0,则X是2的N次方。

5. 8 提示:把m转换为二进制,输出为这个二进制中1的个数。

6. int max = ((a + b) + abs(a - b)) / 2

7. a = a ^ b; b = a ^ b; a = a ^ b;

8. C++支持重载,C不支持重载。函数被C++编译后在库中的名字与C语言不同。C++提供了C连接交换指定符号extern “C”解决名字匹配问题。

9. 防止头文件被重复引用。

10. 见文章:结构体内存对齐。

11. 4 因为var[]等价于*var,已经退化成一个指针了,所以大小是4。

12. 2。

13. 本题定义了一个指针指向一个含有10个int元素的数组。a++表示指针向后移动1*sizeof(数组大小),即移动40个字节。

14. 2 5 数组名本身就是指针,再加个&,就变成了双指针,这里的双指针就是二维数组。

15. 智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,它们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为它们能够确保正确地销毁动态分配的对象。它们可以用于跟踪被多用户共享的动态分配对象。

16. 大概为250 *π 提示:

概率问题:RAND_MAX是随机数中的最大值,也就是相当于最大班级R。x和y是横纵坐标上的亮点,它们的平方和开根号就是原点到该点的距离。题目退化为:随机在正方形里落1000个点,落在半径里面的点有多少个。

a) 1/4圆面积 = (1/4)*π*R*R

b) 正方形面积 = R*R

c) 两者之比 =π/4

d) 落点数 =π/4 * 1000 = 250 *π≈785

17. 第一个为随机数,第二个为98 提示:初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的。常量必须在构造函数的初始化列表里面初始化。

18. C/C++的内存区域分为以下几个类别:

a) 栈区(Stack):由编译器分配和释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。

b) 堆区(Heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能会由操作系统回收。分配方式类似于链表。

c) 全局区(静态区)(static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

d) 文字常量区:常量字符串是放在这里的。程序结束后由系统释放。

e) 程序代码区:存放在函数体的二进制代码。

19. (1)代码如下:

char * strcpy(char * strDest, const char * strSrc){

assert((strDest != NULL) && (strSrc != NULL));

char * address = strDest;

while ((*strDest++ = *strSrc++) != '')

NULL;

return address;

}

(2)为了实现链式表达式,返回具体值。如:

int length = strlen(strcpy(strDest, "Hello world"));

20. 用两个指针,一个步长为1,另一个步长为2,从表头开始一起往前走,如果相遇,表明有环路,否则就是没有了。

{

int i;

T *p = Head, *q = Head;

while ( p != NULL ) {

for ( i = 0; i < STEP1; i ++ ) {

if ( ( p = p->next ) == NULL )

return FALSE;

}

for ( i = 0; i < STEP2; i ++ ) {

if ( ( q = q->next ) == NULL )

return FALSE;

}

if ( p == q ) {

return TRUE;

}

}

return FALSE;

}

21. C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;

改后答案依次为9,10,10,11

22. 266 (低位低地址,高位高地址)

结构体内存对齐

一、什么是字节对齐,为什么要对齐?

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数 据。显然在读取效率上下降很多。

二、请看下面的结构:

struct MyStruct

{

double dda1;

char dda;

int type

[程序员面试宝典总共多少]