C/C++面试题-创新互联
分析一下程序的行为
分析程序的行为1 [chunli@CentOS c]$ cat file_1.c #includeint main() { char *function_1() { return "Hello"; } char *str = function_1(); printf("%s \n", str); return 0; } [chunli@CentOS c]$ gcc file_1.c -Wall && ./a.out Hello --------------------------------- 分析程序的行为2 [chunli@CentOS c]$ cat file_1.c #include void test() { char *function_1() { return "Hello"; } char *str = function_1(); printf("%s \n", str); } int main() { test(); return 0; } [chunli@CentOS c]$ gcc file_1.c -Wall && ./a.out Hello [chunli@CentOS c]$
用递归判断一个数组 是不是递增的
chunli@Linux:~$ cat main.c #includeint IsIncreArray(int *arr,int len) { if(len == 1) return 0; else { if(arr[len-1] < arr[len-2]) return -1; else return IsIncreArray(arr,--len); } } int main() { int array1[10] = {0,1,9,3,4,5,6,7,8,9}; int len1 = sizeof(array1)/sizeof(array1[0]); if(IsIncreArray(array1,len1) == 0) printf("yes\n"); else printf("no\n"); int array2[10] = {0,1,2,3,4,5,6,7,8,9}; int len2 = sizeof(array2)/sizeof(array2[0]); if(IsIncreArray(array2,len2) == 0) printf("yes\n"); else printf("no\n"); return 0; } chunli@Linux:~$ gcc main.c -Wall && ./a.out no yes chunli@Linux:~$
求一个整数,二进制表示出来,有多少个1
#includeusing namespace std; int func(int x) { int count = 0; while (x) { count ++; x = x&(x-1); } return count; } int main(void) { cout << func(9999) << endl; return 0; } chunli@pc0003:~$ g++ main.cpp && ./a.out 8
i++问题
chunli魂斗罗~$ cat main.c #include#include int main() { int a; a= 4; a += (a++); printf("%d\n",a); //9 a= 4; a += (++a); printf("%d\n",a); //10 //a= 4; (a++) += a; printf("%d\n",a); //编译报错 //a= 4; (++a) += a; printf("%d\n",a); //编译报错 return 0; } chunli魂斗罗~$ gcc main.c && ./a.out 9 10 chunli魂斗罗~$
关于i++,++i
#includeusing namespace std; int main(void) { int a,x; for(a=0,x=0; a<=1 && !x++;a++) { a++; } cout< #includeusing namespace std; int main(void) { int a,x; for(a=0,x=0; a<=1 && !x++;) { a++; } cout< 解析:这两段代码的不同点就在for循环那里,前者是for(a=0,x=0; a<=1 &&!x++;a++),
后者是for(a=0,x=0;a<=1 &&!x++;)。
先说第1段代码。
第1步:初始化定义a=0,x=0。
第2步:a小于等于1,x的非为1,符合循环条件。
第3步:x++后x自增为1。
第4步:进入循环体,a++,a自增为1。
第5步:执行for(a=0,x=0;a<=1 &&!x++;a++)中的a++,a自增为2。
第6步:a现在是2,已经不符合小于等于1的条件了,所以“&&”后面的“!x++”不执行,x还是1,不执行循环体。
第7步:打印a和b,分别是2和1。再说第2段代码。
第1步:初始化定义a=0,x=0。
第2步:a小于等于1,x的非为1,符合循环条件。
第3步:x++后x自增为1。
第4步:进入循环体,a++,a自增为1。
第5步:a现在是1,符合小于等于1的条件,所以“&&”后面的“!x++”被执行,x现在是1,x的非为0,不符合循环条件,不执行循环体,但x++依然执行,自增为2。
第6步:打印a和b,分别是1和2。
答案:第一段输出结果是21,第二段输出结果是12。#includeint main(void) { int b =3; int arr[] = {6,7,8,9,10}; int *p = arr; *(p++) += 123; printf("%d,%d\n",*p,*(++p)); } chunli@pc0003:~$ gcc main.c && ./a.out 8,8 解析:C中printf计算参数时是从右到左压栈的。
几个输出结果分别如下:
printf("%d\n ",*ptr);此时ptr应指向第一个元素6。
*(ptr++)+=123应为*ptr=*ptr+123;ptr++,此时ptr应指向第二个元素7。
printf("%d\n ",*(ptr-1));此时输出第一个元素129,注意此时是经过计算的。
printf("%d\n ",*ptr);此时输出第二个元素7,此时ptr还是指向第二个元素7。
printf("%d,%d\n",*ptr,*(++ptr));从右到左运算,第一个是(++ptr),也就是ptr++,*ptr=8,此时ptr指向第三个元素8,所以全部为8。
百鸡百钱问题:#include#include void main() { int i = 0; int j = 0; int k = 0; for(i=0;i<20;i++) { for(j = 0;j<34;j++) { if((100 -i - j) == (100-5*i-3*j)*3 && (100-j-i)%3 == 0 ) { printf("%d,%d,%d\n",i,j,100-i-j); } } } } 编译:
chunli@Linux:~/high$ ./a.out 0,25,75 4,18,78 8,11,81 12,4,84 chunli@Linux:~/high$蛇形数,
1,层数分析:
chunli@http://990487026.blog.51cto.com~/snake$ cat main.c #include#define N 9 //定义矩形的边长 int main() { int arr[N][N] = `0`;//抽象为二维数组模型 int data = 1;//初始值 int y = 0;//控制上下 int x = 0;//控制左右 int ring = 0;//控制层数 //蛇形大法 for(y=0,x=0,ring=0;ring<(N+1)/2;ring++)//控制层数 { //向右跑 while(x ring-1) { arr[y][x] = data; x--; data++; } //向上跑 y--;// x++;// while(y>ring) { arr[y][x] = data; y--; data++; } y++;//恢复为正常向下 x++;//恢复为正常向右 } //打印二维数组 for(y = 0;y 蛇形数,换个方向:
chunli@http://990487026.blog.51cto.com~/snake$ cat main.c #include#define N 25 //定义矩形的边长 int main() { int arr[N][N] = `0`;//抽象为二维数组模型 int data = 1;//初始值 int y = 0;//控制上下 int x = 0;//控制左右 int ring_number = 0;//控制层数 //蛇形大法 for(y=0,x=0,ring_number=0;ring_number<(N+1)/2;ring_number++)//控制层数 { while(y ring_number-1) { arr[y--][x] = data++; } x--;y++;//调整方向 while(x>ring_number) { arr[y][x--] = data++; } x++;y++;//调整方向 } //打印二维数组 for(y = 0;y 指针问题1,求n的值
#includeint main() { char *p = new char[4]; p[0] = 1; p[1] = 2; p[2] =3; p[3] = 4; int * pInt = (int *)p; int n = *pInt; printf("%x\n",n); printf("%d\n",n); } chunli@http://990487026.blog.51cto.com~/seq_queue$ g++ 1.cpp && ./a.out 4030201 67305985 chunli@http://990487026.blog.51cto.com~/seq_queue$ 解析:
char *转译地址时按1个字节取值,
强转为int*,转译地址时按4个字节取值
指针问题2,求n的值
chunli@http://990487026.blog.51cto.com~/seq_queue$ cat 1.cpp #includeint main() { size_t *p = (size_t *)1000; size_t n = (size_t)(p + 100); printf("%ld\n",n); } chunli@http://990487026.blog.51cto.com~/seq_queue$ g++ 1.cpp && ./a.out 1800 chunli@http://990487026.blog.51cto.com~/seq_queue$ 解析:
考察不同数据类型地址偏移的计算
继续指针步长问题
chunli魂斗罗~/review$ cat main.c #includeint main() { int a[5] ={1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d %d\n",*(a+1),*(ptr-1)); return 0; } chunli魂斗罗~/review$ gcc -Wall main.c && ./a.out 2 5 chunli魂斗罗~/review$ 当指针与引用在一起:
[root@linux tmp]# cat main.c #includeint fun(int * &a) { printf("a=%d\n",*a); return 0; } int main() { int a = 10; int *b = &a; fun(b); return 0; } [root@linux tmp]# g++ main.c -Wall && ./a.out a=10 [root@linux tmp]# 当指针与引用在一起:
[root@linux tmp]# cat main.cpp #include#include #include void fun(int *&p) { p = (int *)malloc(0); printf("in fun %p\n",p); } int main(void) { int *p = NULL; printf("in main %p\n",p); fun(p); printf("in main %p\n",p); return 0; } [root@linux tmp]# g++ main.cpp -Wall && ./a.out in main (nil) in fun 0x87e7008 in main 0x87e7008 [root@linux tmp]# 求数组中第N大的数
chunli魂斗罗~/review$ cat main.c #include#include void sort(int *arr,int len) { int i = 0; int j = 0; for(i = 0;i 0;i++) { if(arr[i]!=arr[i+1]) { num_max--; max = arr[i]; } } return max; } int main() { int arr[] = {7,1,3,99,9,7,77,56,99,7,9,5,2,4}; int len = sizeof(arr)/sizeof(int); printf("第1大的数是%d\n",max(arr,len,1)); printf("第2大的数是%d\n",max(arr,len,2)); printf("第3大的数是%d\n",max(arr,len,3)); return 0; } chunli魂斗罗~/review$ gcc -Wall main.c && ./a.out 第1大的数是99 第2大的数是77 第3大的数是56 chunli魂斗罗~/review$ 结构体字节对齐1
chunli魂斗罗~/review$ cat main.c #includetypedef struct A { char t:4; char k:4; unsigned short i:8; unsigned long m; }A; int main() { printf("%ld\n",sizeof(A)); return 0; } chunli魂斗罗~/review$ gcc main.c && ./a.out 16 chunli魂斗罗~/review$ 结构体字节对齐2
chunli魂斗罗~/review$ cat main.c #includetypedef struct A { char str; //1 short x; //2 与char对齐 int num; //4 基本宽度 }A; int main() { printf("%ld\n",sizeof(A)); return 0; } chunli魂斗罗~/review$ gcc main.c && ./a.out 8 chunli魂斗罗~/review$ 结构体字节对齐3
chunli魂斗罗~/review$ cat main.c #includetypedef struct A { char str; //1 int num; //4 short x; //2 }A; int main() { printf("%ld\n",sizeof(A)); return 0; } chunli魂斗罗~/review$ gcc main.c && ./a.out 12 chunli魂斗罗~/review$ 递归实现图形输出
chunli魂斗罗~$ cat main.c #includevoid my_print(int num) { if(!num) { return ; } my_print(num-1); int i = 0; int j = 0; for(i = 0;i 宏定义swap函数
chunli魂斗罗~$ cat main.c #include//#define swap(x,y) (x)=(x)^(y);(y)=(x)^(y);(x)=(x)^(y);//标准答案 #define swap(x,y) (x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y);//答案2 int main() { int a = 1; int b = 2; printf("a=%d b=%d \n",a,b); swap(a,b); printf("a=%d b=%d \n",a,b); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out a=1 b=2 a=2 b=1 chunli魂斗罗~$ 宏定义mix函数
chunli魂斗罗~$ cat main.c #include#define mix(x,y) ((x)<(y)?(x):(y)) int main() { printf("mix=%d\n",mix(4,7)); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out mix=4 chunli魂斗罗~$ 宏定义函数求数组的长度
#define ST(t) ((sizeof(t)/sizeof(t[0]))) int arr[30]; int len = ST(arr);定义宏,传入变量名,传出变量名
#include#define VAR_P(var) printf(#var) int main() { int a = 0; VAR_P(a); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out achunli魂斗罗~$ 插入法排序面试题:
chunli魂斗罗~$ cat main.c #include#include void arr_init(int *arr,int len) { struct timespec tp; clock_gettime(CLOCK_THREAD_CPUTIME_ID,&tp); srand(tp.tv_nsec); int i = 0; for(i = 0;i =0 && arr[i-1]>t);j--) { arr[i] = arr[i-1]; i--; } arr[i] = t; } } int main() { int arr[30]; int len = sizeof(arr)/sizeof(int); arr_init(arr,len); arr_print(arr,len); arr_sort(arr,len); arr_print(arr,len); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out 29 24 41 17 32 36 39 26 45 37 38 14 1 23 15 49 22 25 28 6 29 1 14 17 30 49 49 31 10 16 1 1 6 10 14 14 15 16 17 17 22 23 24 25 26 28 29 29 30 31 32 36 37 38 39 41 45 49 49 49 chunli魂斗罗~$ chunli魂斗罗~$ gcc main.c && ./a.out 38 18 39 16 49 36 34 26 12 18 0 44 18 27 35 45 44 26 24 20 27 26 0 20 47 20 1 20 41 32 0 0 1 12 16 18 18 18 20 20 20 20 24 26 26 26 27 27 32 34 35 36 38 39 41 44 44 45 47 49 chunli魂斗罗~$ chunli魂斗罗~$ gcc main.c && ./a.out 19 34 44 20 9 30 1 45 0 12 44 9 14 42 2 5 13 36 5 14 11 11 46 17 43 15 46 34 15 1 0 1 1 2 5 5 9 9 11 11 12 13 14 14 15 15 17 19 20 30 34 34 36 42 43 44 44 45 46 46 chunli魂斗罗~$ 判断一个数是不是2的幂指数
chunli魂斗罗~$ cat main.c #include#include int main() { int a ; a = 4; printf("%c\n",a&(a-1)?'n':'y'); a = 7; printf("%c\n",a&(a-1)?'n':'y'); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out y n chunli魂斗罗~$ 数据类型自动转换问题
chunli魂斗罗~$ cat main.c #include#include int main() { unsigned int a = 6; int b = -20; (a+b>6)?puts(">6"):puts("<=6"); unsigned long c = a+b; printf("%ld\n",c); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out >6 4294967282 chunli魂斗罗~$ 自己完成strcpy函数
chunli魂斗罗~$ cat main.c #includechar* my_strcpy(char *dest,const char* src) { if(dest==NULL || src==NULL) return NULL; while(*dest++=*src++); } int main() { char buf[30]; char *str = "Hello World!"; my_strcpy(buf,str); printf("%s\n",buf); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out Hello World! chunli魂斗罗~$ 字符转数字
chunli魂斗罗~$ cat main.c #includeint char_to_int(char *str) { int num = 0; while(*str != '\0') { num = num*10+*str-48;; str++; } return num; } int main() { printf("%d\n",char_to_int("1213141516")); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out 1213141516 chunli魂斗罗~$ 求一个数的右4位
chunli魂斗罗~$ cat main.c #includeint main() { unsigned int n = 0x12345678; n = n<<28; n = n>>28; printf("%x\n",n); return 0; } chunli魂斗罗~$ gcc main.c && ./a.out 8 chunli魂斗罗~$ 数组定义问题1,sizeof编译时为常量
chunli?魂斗罗~$ cat main.c #includeint main() { char arr[sizeof(char)]; printf("%ld\n",sizeof(arr)); return 0; } chunli?魂斗罗~$ gcc main.c -Wall && ./a.out 1 chunli?魂斗罗~$ 数组定义问题2,const编译时为常量
chunli魂斗罗~$ cat main.c #includeint main() { const int a = 5; char arr[a]; printf("%ld\n",sizeof(arr)); return 0; } chunli魂斗罗~$ gcc main.c -Wall && ./a.out 5 chunli魂斗罗~$ 数组定义问题1,const编译时为常量,
chunli魂斗罗~$ cat main.c #includeint main() { int a = 5; const char brr[a];//无法初始化 char const arr[a]; printf("%ld\n",sizeof(brr)); printf("%ld\n",sizeof(arr)); return 0; } chunli魂斗罗~$ gcc main.c -Wall && ./a.out 5 5 chunli魂斗罗~$ 函数指针面试题1:
void*(*(*fun)(int))[10]
分析1:这是指针数组
分析2:fun为函数指针,参数类型为int,返回值为void*
综合:数组里面有10个元素,每个元素都指向一个void*的函数指针
函数指针面试题3:[超难]
int(*(*fun)())[10]();
fun是一个指针,指向一个函数,参数为空,返回值是指针,指针指向一个数组,
数组有10个元素,每个元素都是一个指针,指向一个参数为空返回值为int类型的函数
多态中虚函数表是编译时建立的,运行时调用回调函数
chunli魂斗罗~$ cat main.c #include#include #include char *fun2(char *str){ char *p = (char*)malloc(100); strcpy(p,str); return p; } char *fun1(char* (*p)(char *pp1),char *p2){ return p(p2); } int main(){ char *str = "abcdefghijkl"; char *p = fun1(fun2,str); printf("%s\n",p); free(p); p = NULL; return 0; } chunli魂斗罗~$ gcc main.c -Wall && ./a.out abcdefghijkl chunli魂斗罗~$ 另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章题目:C/C++面试题-创新互联
分享路径:http://scyanting.com/article/cojppc.html