您的位置:首页 > 编程语言 > C语言/C++

华为经典C语言面试题(二)

2017-01-03 23:11 381 查看
2、找错

  DSN get_SRM_no()

{
  static int SRM_no;
  int I;

  for(I=0;I<MAX_SRM;I++)

    {

       SRM_no %= MAX_SRM;

       if(MY_SRM.state==IDLE)

       {

         break;

       }

    }

    if(I>=MAX_SRM)

       return (NULL_SRM);

    else

       return SRM_no;

}

 

    这里for循环的判断语句是后来我加上的,估计在网上流传的时候被人给弄丢了,根据对程序的分析,给补上了。估计错误应该不是这儿。

    简单的阅读一下这个函数,可以大概的可以猜测出这个函数的功能是分配一个空闲的SRAM块。方法:从上次分配的RAM块后的RAM块开始检测SRAM每个RAM块,看是否是IDLE状态,如果是IDLE则返回当前的RAM块的号SRM_no.如果所有的RAM块都不是IDLE状态,则意味着无法分配一个RAM给函数调用者,返回一个表示没有RAM可分配的标志(NULL_SRM)。
    经过上面的分析,则这里可以知道,这个函数的错误是for循环里面没有给SRM_no这个变量累加1.
    3、写出程序运行结果

  int sum(int a)

{

    auto int c=0;

    static int b=3;

    c+=1;

    b+=2;

    return(a+b+c);

}

void main()

{

    int I;

    int a=2;

    for(I=0;I<5;I++)

    {

       printf("%d,", sum(a));

    }

}

    运行结果是:8,10,12,14,16,
    在求和函数sum里面c是auto变量,根据auto变量特性知每次调用sum函数时变量c都会自动赋值为0.b是static变量,根据static变量特性知每次调用sum函数时变量b都会使用上次调用sum函数时b保存的值。
    简单的分析一下函数,可以知道,若传入的参数不变,则每次调用sum函数返回的结果,都比上次多2.所以答案是:8,10,12,14,16,

  4、func(1)
= ?

int func(int a)

{

    int b;

    switch(a)

    {

        case 1: 30;

        case 2: 20;

        case 3: 16;

        default: 0;

    }

    return b;

}

    在 case
语句中可能忘记了对变量b赋值。如果改为下面的代码:

  int func(int a)

{

    int b;

    switch(a)

    {

        case 1:      b = 30;

        case 2:      b = 20;

        case 3:      b = 16;

        default:     b = 0;

    }

    return b;

}

 

    因为case语句中漏掉了break语句,所以无论传给函数的参数是多少,运行结果均为0.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: