printf("%3d",a[j]);
printf("\n");
}
}
二、朗讯面试题:
Therearetwointvariables:
aandb,don’tuse“if”,“?
:
”,“switch”orotherjudgementstatements,findoutthebiggestoneofthetwonumbers.
参考答案:
方案一
intmax=((a+b)+abs(a-b))/2
方案二
intc=a-b;
char*strs[2]={"a大","b大"};
c=unsigned(c)>>(sizeof(int)*8-1);
三、朗讯面试题:
如何打印出当前源文件的文件名以及源文件的当前行号?
参考答案:
通常使用的就是__FILE__,__LINE__,在调试函数中利用“%s","%ld",打印就好了。
四、朗讯面试题:
main主函数执行完毕后,是否可能会再执行一段代码,给出说明?
参考答案:
crt会执行另一些代码,进行处理工作。
如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。
语法:
#include
intatexit(void(*function")(void));
#include
#include
voidfn1(void),fn2(void),fn3(void),fn4(void);
intmain(void)
{
atexit(fn1);
atexit(fn2);
atexit(fn3);
atexit(fn4);
printf("Thisisexecutedfirst.\n");
}
voidfn1()
{
printf("next.\n");
}
voidfn2()
{
printf("executed");
}
voidfn3()
{
printf("is");
}
voidfn4()
{
printf("This");
}
五、朗讯面试题:
如何判断一段程序是由C编译程序还是由C++编译程序编译的?
参考答案:
c++编译时定义了__cplusplus
c编译时定义了_STDC_
六、下面这道面试题怎么做(指针)?
#include
main(){
intc[3][3]={1,2,3,4,5,6,7,8,9};
for(inti=0;i<3;i++)
for(intj=0;j<3;j++)
printf("%ld\n",&c[j]);
printf("-------------------------\n");
printf("%ld\n",(c+1));
printf("%ld\n",(*c+1));
printf("%ld\n",&c[0][0]);
printf("%ld\n",**c);
printf("%ld\n",*c[0]);
if(int(c)==int(*c))
printf("equl");
}
为什么c,*c的值相等,(c+1),(*c+1)的值不等
c,*c,**c,代表什么意思?
参考答案:
c是第一个元素的地址,*c是第一行元素的首地址,其实第一行元素的地址就是第一个元素的地址,这容易理解。
**c是提领第一个元素。
为什么c,*c的值相等?
intc因为直接用c表示数组c[0][0]
printf("%ld\n",*c[0]);语句已将指针移到数组头。
int(*c)表示c0的值为1,所以相等。
数组c的存放空间示意如下:
(机器中是行优先存放的)
c[0][0]c[0][1]c[0][2]
c[1][0]c[1][1]c[1][2]
c[2][0]c[2][1]c[2][2]
c是一个二维数组名,实际上它是一个指针常量,不能进行自加、自减运算,即:
c++、c--、++c、--c
都是不允许的;
c:
数组名;是一个二维指针,它的值就是数组的首地址,也即第一行元素的首地址(等于*c),也
等于第一行第一个元素的地址(&c[0][0]);可以说成是二维数组的行指针。
*c:
第一行元素的首地址;是一个一维指针,可以说成是二维数组的列指针。
**c:
二维数组中的第一个元素的值;即:
c[0][0]
所以:
c和*c的值是相等的,但他们两者不能相互赋值,(类型不同);
(c+1):
c是行指针,(c+1)是在c的基础上加上二维数组一行的地址长度,即从&c[0][0]
变到了&c[1][0];
(*c+1):
*c是列指针,(*c+1)是在*c的基础上加上二数组一个元素的所占的长度,即从
&c[0][0]变到了&c[0][1]
从而(c+1)和(*c+1)的值就不相等了
七、定义int**a[3][4],则变量占有的内存空间为:
_____
参考答案:
int**p;/*16位下sizeof(p)=2,32位下sizeof(p)=4*/
总共 3*4*sizeof(p)
八、编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
参考答案:
判断年份是否是闰年,月份的大小月,
月(12进制)、日(与闰年、大小月有关)、时(24进制)、分(60进制)、妙(60进制)
九、给出下面代码的输出
floata=1.0f;
cout<<(int)a<cout<<(int&)a<cout<floatb=0.0f;
cout<<(int)b<cout<<(int&)b<cout<输出结果是:
1
1065353216
false
0
0
true
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。
企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?
我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。
读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。
此外,还有一些面试题考查面试者敏捷的思维能力。
分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。
2.找错题
试题1:
voidtest1()
{
charstring[10];
char*str1="0123456789";
strcpy(string,str1);
}
试题2:
voidtest2()
{
charstring[10],str1[10];
inti;
for(i=0;i<10;i++)
{
str1[i]='a';
}
strcpy(string,str1);
}
试题3:
voidtest3(char*str1)
{
charstring[10];
if(strlen(str1)<=10)
{
strcpy(string,str1);
}
}
解答:
试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;
对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式(停止条件)的给10分;
对试题3,if(strlen(str1)<=10)应改为if(strlen(str1)<10),因为strlen的结果未统计’\0’所占用的1个字节。
剖析:
考查对基本功的掌握:
(1)字符串以’\0’结尾;
(2)对数组越界把握的敏感度;
(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
voidstrcpy(char*strDest,char*strSrc)
{
while((*strDest++=*strSrc++)!
=‘\0’);
}
4分
voidstrcpy(char*strDest,constchar*strSr