当前位置:文档之家› 程序员面试宝典题目总结

程序员面试宝典题目总结

1.What will be the output of the following C code?#include <stdio.h>int main(int argc, char* argv[]){int b=3;int arr[] = {6, 7, 8, 9, 10};int *ptr = arr;*(ptr++) += 123;printf("%d, %d\n", *ptr, *(++ptr));return 0;}2.下面程序的结果是多少?#include <stdio.h>int main(int argc, char* argv[]){unsigned char a = 0xA5;unsigned char b = ~a>>4;printf("b = %d\n", b);return 0;}3.下面程序的结果是:#include <stdio.h>int main(int argc, char* argv[]){unsigned int a = 0xFFFFFFF7;unsigned char i = (unsigned char)a;char * b = (char *)&a;printf("%08x, %08x\n", i, *b);return 0;}4.用一个表达式,判断一个数X是否为2的N次方(2,4,8,…),不可用循环语句。

5.下面程序的结果是:#include <iostream>#include <string>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 <stdlib.h>#include <time.h>#define LOOP 1000int main(int argc, char* argv[]){int rgnC = 0;srand((unsigned int)time(NULL));for (int i=0; i<LOOP; i++){int x = rand();int y = rand();if (x*x + y*y < RAND_MAX * RAND_MAX)rgnC++;}printf("%d\n", rgnC);return 0;}17.下面程序的输出结果是:#include <iostream>#include <string>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\n",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)) / 27. 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 *π概率问题:R。

x 和y是横纵坐标上的亮点,它们的平方和开根号就是原点到该点的距离。

题目退化为:随机在正方形里落1000个点,落在半径里面的点有多少个。

a)1/4圆面积= (1/4)*π*R*Rb)正方形面积= R*Rc)两者之比=π/4d)落点数=π/4 * 1000 = 250 *π≈78517.第一个为随机数,第二个为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++) != '\0')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,1122.266 (低位低地址,高位高地址)结构体内存对齐原文地址:/dignity99/blog/item/6f549f173bf8811f962b4372.html 一、什么是字节对齐,为什么要对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

相关主题