C语言经典面试题10道(六)
51.
main()
{
int a[5]={1,2,3,4,5};
int * ptr=(int*)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
}
请问输出:答案:2,5
详解:a代表数组首地址,即* a=1,* (a+1)=2
&a代表数组指针,其类型为int (*)[5],所以&a+1可以理解为在数组指针的基础上偏移为5,然后强制转换为int类型的指针赋给ptr,所以是下个数组的首地址,ptr-1即为上个数组的最后一位,所以是a[4]=5
52.请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;答案:内外层循环反了,正确应该是:
int a[60][250][1000],i,j,k;
for(k=0;k<=60;k++)
for(j=0;j<250;j++)
for(i=0;i<1000;i++)
a[k][j][i]=0;
53.以下是求一个数的平方的程序,请找出错误:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);答案:在替换后b=((a++) * (a++)),算得b=(5 * 6)=30。可能在不同编译器下得到不同答案。
54.
#define Max_CB 500
void LmiQueryCSmd(StructMSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
}
} 这段代码执行有什么问题?答案:死循环,因为unsigned char 的取值范围在0~255之间,所以ucCmdNum永远小于Max_CB。
55.嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。
答案:while(1);或者for ( ;1;) ;
56.
int x;
int modifyvalue()
{
return(x+=10);
}
int changevalue(int x)
{
return(x+=1);
}
void main()
{
int x =10;
x++;
changevalue(x);
x++;
modifyvalue();
printf("First output:%dn",x);
x++;
changevalue(x);
printf("Second output:%dn",x);
modifyvalue();
printf("Thirdoutput:%dn",x);
}输出?答案:12,13,13
详解:modifyvalue()里面的x相当于全局变量x,而不是main()函数内的局部变量x。而changevalue()函数我们可以理解为:
int changevalue( int x)
{undefined
int a;
a=x;
return(a+=1);
}
函数内部参与运算的是形参,所以实参没有改变。
57.不能做switch()的参数类型是:
答案:switch 的参数不能为实型。
58.请写出下列代码的输出内容
#include <stdio.h>
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c ,d:%d,%d,%d",b,c,d );
return 0;
}答案:10,12,120
59.一语句实现x是否为2 的若干次幂的判断。
答案:
void main()
{undefined
int a;
scanf(“%d”,&a);
printf(“%c”,(a)&(a-1)?’n’:’y’); // 若是打印y,否则n
}
详解:(a)&(a-1)?‘n’:‘y’;意思是(a)&(a-1)结果为1则输出n,结果为0则输出y
60.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C 支持中断。具代表事实是,产生了一个新的关键字__interrupt 。下面的代码就使用了__interrupt 关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}答案:
(1)中断不能有入参和返回值;
(2)在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就是不允许在ISR 中做浮点运算。此外,ISR 应该是短而有效率的,在ISR 中做浮点运算是不明智的;
(3)与第三点一脉相承,printf() 经常有重入和性能上的问题。