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() 经常有重入和性能上的问题。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会创建对象

谢谢考官。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值