C/C++ 面试题
分析一下程序的行为
分析程序的行为1[chunli@CentOSc]$catfile_1.c#include<stdio.h>intmain(){char*function_1(){return"Hello";}char*str=function_1();printf("%s\n",str);return0;}[chunli@CentOSc]$gccfile_1.c-Wall&&./a.outHello---------------------------------分析程序的行为2[chunli@CentOSc]$catfile_1.c#include<stdio.h>voidtest(){char*function_1(){return"Hello";}char*str=function_1();printf("%s\n",str);}intmain(){test();return0;}[chunli@CentOSc]$gccfile_1.c-Wall&&./a.outHello[chunli@CentOSc]$
用递归判断一个数组 是不是递增的
chunli@Linux:~$catmain.c#include<stdio.h>intIsIncreArray(int*arr,intlen){if(len==1)return0;else{if(arr[len-1]<arr[len-2])return-1;elsereturnIsIncreArray(arr,--len);}}intmain(){intarray1[10]={0,1,9,3,4,5,6,7,8,9};intlen1=sizeof(array1)/sizeof(array1[0]);if(IsIncreArray(array1,len1)==0)printf("yes\n");elseprintf("no\n");intarray2[10]={0,1,2,3,4,5,6,7,8,9};intlen2=sizeof(array2)/sizeof(array2[0]);if(IsIncreArray(array2,len2)==0)printf("yes\n");elseprintf("no\n");return0;}chunli@Linux:~$gccmain.c-Wall&&./a.outnoyeschunli@Linux:~$
求一个整数,二进制表示出来,有多少个1
#include<iostream>usingnamespacestd;intfunc(intx){intcount=0;while(x){count++;x=x&(x-1);}returncount;}intmain(void){cout<<func(9999)<<endl;return0;}chunli@pc0003:~$g++main.cpp&&./a.out8
i++问题
chunli魂斗罗~$catmain.c#include<stdio.h>#include<string.h>intmain(){inta;a=4;a+=(a++);printf("%d\n",a);//9a=4;a+=(++a);printf("%d\n",a);//10//a=4;(a++)+=a;printf("%d\n",a);//编译报错//a=4;(++a)+=a;printf("%d\n",a);//编译报错return0;}chunli魂斗罗~$gccmain.c&&./a.out910chunli魂斗罗~$
关于i++,++i
#include<iostream>usingnamespacestd;intmain(void){inta,x;for(a=0,x=0;a<=1&&!x++;a++){a++;}cout<<a<<x<<endl;return0;}chunli@pc0003:~$g++main.cpp&&./a.out21
#include<iostream>usingnamespacestd;intmain(void){inta,x;for(a=0,x=0;a<=1&&!x++;){a++;}cout<<a<<x<<endl;return0;}chunli@pc0003:~$g++main.cpp&&./a.out12
解析:这两段代码的不同点就在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。
#include<stdio.h>intmain(void){intb=3;intarr[]={6,7,8,9,10};int*p=arr;*(p++)+=123;printf("%d,%d\n",*p,*(++p));}chunli@pc0003:~$gccmain.c&&./a.out8,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<stdio.h>#include<stdlib.h>voidmain(){inti=0;intj=0;intk=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.out0,25,754,18,788,11,8112,4,84chunli@Linux:~/high$
蛇形数,
1,层数分析:
chunli@http://990487026.blog.51cto.com~/snake$catmain.c#include<stdio.h>#defineN9//定义矩形的边长intmain(){intarr[N][N]=`0`;//抽象为二维数组模型intdata=1;//初始值inty=0;//控制上下intx=0;//控制左右intring=0;//控制层数//蛇形大法for(y=0,x=0,ring=0;ring<(N+1)/2;ring++)//控制层数{//向右跑while(x<N-ring){arr[y][x]=data;x++;data++;}//向下跑x--;//此时x==N,向左回退,调整方向y++;//向下转一行,相当于定位到第二行末尾while(y<N-ring){arr[y][x]=data;y++;data++;}//向左跑y--;//向上回退,相当于定位到N行的末尾x--;//此时x==N,调整方向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<N;y++){for(x=0;x<N;x++){printf("%3d",arr[y][x]);}printf("\n");}return0;}chunli@http://990487026.blog.51cto.com~/snake$gccmain.c-Wall&&./a.out123456789323334353637383910315657585960614011305572737475624112295471808176634213285370797877644314275269686766654415265150494847464516252423222120191817chunli@http://990487026.blog.51cto.com~/snake$
蛇形数,换个方向:
chunli@http://990487026.blog.51cto.com~/snake$catmain.c#include<stdio.h>#defineN25//定义矩形的边长intmain(){intarr[N][N]=`0`;//抽象为二维数组模型intdata=1;//初始值inty=0;//控制上下intx=0;//控制左右intring_number=0;//控制层数//蛇形大法for(y=0,x=0,ring_number=0;ring_number<(N+1)/2;ring_number++)//控制层数{while(y<N-ring_number){arr[y++][x]=data++;}x++;y--;//调整方向while(x<N-ring_number){arr[y][x++]=data++;}x--;y--;//调整方向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<N;y++){for(x=0;x<N;x++){printf("%4d",arr[y][x]);}printf("\n");}return0;}chunli@http://990487026.blog.51cto.com~/snake$gccmain.c-Wall&&./a.out11615141321724231231825221141920211056789chunli@http://990487026.blog.51cto.com~/snake$gccmain.c-Wall&&./a.out156555453525150494847464544432571041031021011009998979695949342358105144143142141140139138137136135924145910614517617517417317217117016913491405601071461772001991981971961951681339039661108147178201216215214213194167132893876210914817920221722422321219316613188378631101491802032182252222111921651308736964111150181204219220221210191164129863510651121511822052062072082091901631288534116611315218318418518618718818916212784331267114153154155156157158159160161126833213681151161171181191201211221231241258231146970717273747576777879808130151617181920212223242526272829chunli@http://990487026.blog.51cto.com~/snake$gccmain.c-Wall&&./a.out196959493929190898887868584838281807978777675747329718418318218118017917817717617517417317217117016916816716616516416372398185264263262261260259258257256255254253252251250249248247246245162714991862653363353343333323313303293283273263253243233223213203192441617051001872663374003993983973963953943933923913903893883873863853182431606961011882673384014564554544534524514504494484474464454444433843172421596871021892683394024575045035025015004994984974964954944934423833162411586781031902693404034585055445435425415405395385375365354924413823152401576691041912703414044595065455765755745735725715705695344914403813142391566510105192271342405460507546577600599598597596595568533490439380313238155641110619327234340646150854757860161661561461359456753248943837931223715463121071942733444074625095485796026176246236125935665314884373783112361536213108195274345408463510549580603618625622611592565530487436377310235152611410919627534640946451155058160461962062161059156452948643537630923415160151101972763474104655125515826056066076086095905635284854343753082331505916111198277348411466513552583584585586587588589562527484433374307232149581711219927834941246751455355455555655755855956056152648343237330623114857181132002793504134685155165175185195205215225235245254824313723052301475619114201280351414469470471472473474475476477478479480481430371304229146552011520228135241541641741841942042142242342442542642742842937030322814554211162032823533543553563573583593603613623633643653663673683693022271445322117204283284285286287288289290291292293294295296297298299300301226143522311820520620720820921021121221321421521621721821922022122222322422514251241191201211221231241251261271281291301311321331341351361371381391401415025262728293031323334353637383940414243444546474849chunli@http://990487026.blog.51cto.com~/snake$
指针问题1,求n的值
#include<stdio.h>intmain(){char*p=newchar[4];p[0]=1;p[1]=2;p[2]=3;p[3]=4;int*pInt=(int*)p;intn=*pInt;printf("%x\n",n);printf("%d\n",n);}chunli@http://990487026.blog.51cto.com~/seq_queue$g++1.cpp&&./a.out403020167305985chunli@http://990487026.blog.51cto.com~/seq_queue$
解析:
char *转译地址时按1个字节取值,
强转为int*,转译地址时按4个字节取值
指针问题2,求n的值
chunli@http://990487026.blog.51cto.com~/seq_queue$cat1.cpp#include<stdio.h>intmain(){size_t*p=(size_t*)1000;size_tn=(size_t)(p+100);printf("%ld\n",n);}chunli@http://990487026.blog.51cto.com~/seq_queue$g++1.cpp&&./a.out1800chunli@http://990487026.blog.51cto.com~/seq_queue$
解析:
考察不同数据类型地址偏移的计算
继续指针步长问题
chunli魂斗罗~/review$catmain.c#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d%d\n",*(a+1),*(ptr-1));return0;}chunli魂斗罗~/review$gcc-Wallmain.c&&./a.out25chunli魂斗罗~/review$
当指针与引用在一起:
[root@linuxtmp]#catmain.c#include<stdio.h>intfun(int*&a){printf("a=%d\n",*a);return0;}intmain(){inta=10;int*b=&a;fun(b);return0;}[root@linuxtmp]#g++main.c-Wall&&./a.outa=10[root@linuxtmp]#
当指针与引用在一起:
[root@linuxtmp]#catmain.cpp#include<iostream>#include<stdio.h>#include<stdlib.h>voidfun(int*&p){p=(int*)malloc(0);printf("infun%p\n",p);}intmain(void){int*p=NULL;printf("inmain%p\n",p);fun(p);printf("inmain%p\n",p);return0;}[root@linuxtmp]#g++main.cpp-Wall&&./a.outinmain(nil)infun0x87e7008inmain0x87e7008[root@linuxtmp]#
求数组中第N大的数
chunli魂斗罗~/review$catmain.c#include<stdio.h>#include<stdlib.h>voidsort(int*arr,intlen){inti=0;intj=0;for(i=0;i<len-1;i++){intindex=i;for(j=i+1;j<len;j++){if(arr[index]<arr[j]){index=j;}}intt=arr[i];arr[i]=arr[index];arr[index]=t;}}intmax(int*arr,intlen,intnum_max){sort(arr,len);intmax=0;inti=0;for(i=0;i<len&&num_max>0;i++){if(arr[i]!=arr[i+1]){num_max--;max=arr[i];}}returnmax;}intmain(){intarr[]={7,1,3,99,9,7,77,56,99,7,9,5,2,4};intlen=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));return0;}chunli魂斗罗~/review$gcc-Wallmain.c&&./a.out第1大的数是99第2大的数是77第3大的数是56chunli魂斗罗~/review$
结构体字节对齐1
chunli魂斗罗~/review$catmain.c#include<stdio.h>typedefstructA{chart:4;chark:4;unsignedshorti:8;unsignedlongm;}A;intmain(){printf("%ld\n",sizeof(A));return0;}chunli魂斗罗~/review$gccmain.c&&./a.out16chunli魂斗罗~/review$
结构体字节对齐2
chunli魂斗罗~/review$catmain.c#include<stdio.h>typedefstructA{charstr;//1shortx;//2与char对齐intnum;//4基本宽度}A;intmain(){printf("%ld\n",sizeof(A));return0;}chunli魂斗罗~/review$gccmain.c&&./a.out8chunli魂斗罗~/review$
结构体字节对齐3
chunli魂斗罗~/review$catmain.c#include<stdio.h>typedefstructA{charstr;//1intnum;//4shortx;//2}A;intmain(){printf("%ld\n",sizeof(A));return0;}chunli魂斗罗~/review$gccmain.c&&./a.out12chunli魂斗罗~/review$
递归实现图形输出
chunli魂斗罗~$catmain.c#include<stdio.h>voidmy_print(intnum){if(!num){return;}my_print(num-1);inti=0;intj=0;for(i=0;i<num;i++){printf("*");for(j=1;j<num;j++){printf(".");}}printf("\n");}intmain(){my_print(9);return0;}chunli魂斗罗~$gccmain.c&&./a.out**.*.*..*..*..*...*...*...*...*....*....*....*....*....*.....*.....*.....*.....*.....*.....*......*......*......*......*......*......*......*.......*.......*.......*.......*.......*.......*.......*.......*........*........*........*........*........*........*........*........*........chunli魂斗罗~$
宏定义swap函数
chunli魂斗罗~$catmain.c#include<stdio.h>//#defineswap(x,y)(x)=(x)^(y);(y)=(x)^(y);(x)=(x)^(y);//标准答案#defineswap(x,y)(x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y);//答案2intmain(){inta=1;intb=2;printf("a=%db=%d\n",a,b);swap(a,b);printf("a=%db=%d\n",a,b);return0;}chunli魂斗罗~$gccmain.c&&./a.outa=1b=2a=2b=1chunli魂斗罗~$
宏定义mix函数
chunli魂斗罗~$catmain.c#include<stdio.h>#definemix(x,y)((x)<(y)?(x):(y))intmain(){printf("mix=%d\n",mix(4,7));return0;}chunli魂斗罗~$gccmain.c&&./a.outmix=4chunli魂斗罗~$
宏定义函数求数组的长度
#defineST(t)((sizeof(t)/sizeof(t[0])))intarr[30];intlen=ST(arr);
定义宏,传入变量名,传出变量名
#include<stdio.h>#defineVAR_P(var)printf(#var)intmain(){inta=0;VAR_P(a);return0;}chunli魂斗罗~$gccmain.c&&./a.outachunli魂斗罗~$
插入法排序面试题:
chunli魂斗罗~$catmain.c#include<stdio.h>#include<time.h>voidarr_init(int*arr,intlen){structtimespectp;clock_gettime(CLOCK_THREAD_CPUTIME_ID,&tp);srand(tp.tv_nsec);inti=0;for(i=0;i<len;i++){arr[i]=rand()%50;}}voidarr_print(int*arr,intlen){inti=0;for(i=0;i<len;i++){printf("%d",arr[i]);}printf("\n");}voidarr_sort(int*arr,intlen){inti=0;intj=0;intt=0;for(i=1;i<len;i++){t=arr[i];for(j=i-1;(j>=0&&arr[i-1]>t);j--){arr[i]=arr[i-1];i--;}arr[i]=t;}}intmain(){intarr[30];intlen=sizeof(arr)/sizeof(int);arr_init(arr,len);arr_print(arr,len);arr_sort(arr,len);arr_print(arr,len);return0;}chunli魂斗罗~$gccmain.c&&./a.out292441173236392645373814123154922252862911417304949311016116101414151617172223242526282929303132363738394145494949chunli魂斗罗~$chunli魂斗罗~$gccmain.c&&./a.out381839164936342612180441827354544262420272602047201204132001121618181820202020242626262727323435363839414444454749chunli魂斗罗~$chunli魂斗罗~$gccmain.c&&./a.out19344420930145012449144225133651411114617431546341510112559911111213141415151719203034343642434444454646chunli魂斗罗~$
判断一个数是不是2的幂指数
chunli魂斗罗~$catmain.c#include<stdio.h>#include<string.h>intmain(){inta;a=4;printf("%c\n",a&(a-1)?'n':'y');a=7;printf("%c\n",a&(a-1)?'n':'y');return0;}chunli魂斗罗~$gccmain.c&&./a.outynchunli魂斗罗~$
数据类型自动转换问题
chunli魂斗罗~$catmain.c#include<stdio.h>#include<string.h>intmain(){unsignedinta=6;intb=-20;(a+b>6)?puts(">6"):puts("<=6");unsignedlongc=a+b;printf("%ld\n",c);return0;}chunli魂斗罗~$gccmain.c&&./a.out>64294967282chunli魂斗罗~$
自己完成strcpy函数
chunli魂斗罗~$catmain.c#include<stdio.h>char*my_strcpy(char*dest,constchar*src){if(dest==NULL||src==NULL)returnNULL;while(*dest++=*src++);}intmain(){charbuf[30];char*str="HelloWorld!";my_strcpy(buf,str);printf("%s\n",buf);return0;}chunli魂斗罗~$gccmain.c&&./a.outHelloWorld!chunli魂斗罗~$
字符转数字
chunli魂斗罗~$catmain.c#include<stdio.h>intchar_to_int(char*str){intnum=0;while(*str!='\0'){num=num*10+*str-48;;str++;}returnnum;}intmain(){printf("%d\n",char_to_int("1213141516"));return0;}chunli魂斗罗~$gccmain.c&&./a.out1213141516chunli魂斗罗~$
求一个数的右4位
chunli魂斗罗~$catmain.c#include<stdio.h>intmain(){unsignedintn=0x12345678;n=n<<28;n=n>>28;printf("%x\n",n);return0;}chunli魂斗罗~$gccmain.c&&./a.out8chunli魂斗罗~$
数组定义问题1,sizeof编译时为常量
chunli?魂斗罗~$catmain.c#include<stdio.h>intmain(){chararr[sizeof(char)];printf("%ld\n",sizeof(arr));return0;}chunli?魂斗罗~$gccmain.c-Wall&&./a.out1chunli?魂斗罗~$
数组定义问题2,const编译时为常量
chunli魂斗罗~$catmain.c#include<stdio.h>intmain(){constinta=5;chararr[a];printf("%ld\n",sizeof(arr));return0;}chunli魂斗罗~$gccmain.c-Wall&&./a.out5chunli魂斗罗~$
数组定义问题1,const编译时为常量,
chunli魂斗罗~$catmain.c#include<stdio.h>intmain(){inta=5;constcharbrr[a];//无法初始化charconstarr[a];printf("%ld\n",sizeof(brr));printf("%ld\n",sizeof(arr));return0;}chunli魂斗罗~$gccmain.c-Wall&&./a.out55chunli魂斗罗~$
函数指针面试题1:
void*(*(*fun)(int))[10]
分析1:这是指针数组
分析2:fun为函数指针,参数类型为int,返回值为void*
综合:数组里面有10个元素,每个元素都指向一个void*的函数指针
函数指针面试题3:[超难]
int(*(*fun)())[10]();
fun是一个指针,指向一个函数,参数为空,返回值是指针,指针指向一个数组,
数组有10个元素,每个元素都是一个指针,指向一个参数为空返回值为int类型的函数
多态中虚函数表是编译时建立的,运行时调用
回调函数
chunli魂斗罗~$catmain.c#include<stdio.h>#include<stdlib.h>#include<string.h>char*fun2(char*str){char*p=(char*)malloc(100);strcpy(p,str);returnp;}char*fun1(char*(*p)(char*pp1),char*p2){returnp(p2);}intmain(){char*str="abcdefghijkl";char*p=fun1(fun2,str);printf("%s\n",p);free(p);p=NULL;return0;}chunli魂斗罗~$gccmain.c-Wall&&./a.outabcdefghijklchunli魂斗罗~$
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。