程序员面试宝典 csdn

学人智库 时间:2018-01-13 我要投稿
【meiwen.anslib.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#includeusing 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

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

rgnC++;

}

printf("%d ", rgnC);

return 0;

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

#include#includeusing 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++的内置指针。智能指针在面

对异常的时候格外有用,因为它们能够确保正确地销毁动态分配的对象。它们可以用于跟踪被多用户共享的动态分配对象。

[程序员面试宝典 csdn]