第21章 常见面试题及解答

如今人们大多选择自主择业,无论到什么公司就职,通常都需要通过面试这一关。对于从事单片机、嵌入式开发的工程师来说,面试最重要的一项内容就是考查求职者的职业技能。在各种各样的面试题中,有些内容是许多公司在笔试题中易出的考题,因为这些内容常被视为在IT领域从业人员所必须掌握的基础知识。本章将选择一些与C51和MCS-51相关的面试题有针对性地进行讲解,帮助求职者顺利通过面试。

21.1 C51编程类面试题

C51程序语言的关键字不多,并且由于面试时间所限,面试题主要以基础知识为主,下面介绍一些这方面的相关试题。

21.1.1 预处理

1.用预处理指令声明一个常数,表示2011年1月共有多少秒。

本题主要考查以下几个知识点:

❑预处理指令#define的语法基础,如不能以分号结束等。

❑由于得到的秒数是一个大整数,不能用整型数据,而需要使用长整型。

❑由于时间不能为负数,应使用无符号长整型数据来表示。

参考答案:#define SECONDS_FOR_JANUARY(312460*60)UL

2.编写宏代码,该宏有两个参数,要求返回其中的较大值。

本题主要考查以下知识点:

❑预处理指令#define的基础知识。

❑3种条件操作符的知识。这个操作符存在于C语言中的原因是它使得编译器能产生比if-

then-else更为优化的代码,了解这个用法是很重要的。

❑在宏中应将参数用括号括起来。

参考答案:#define MAX(A,B)((A)>=(B)?(A):(B))

3.现有宏定义#define MOD(x,y)x%y。

执行以下语句:


int a=13,b=94;

printf(“%d\n”,MOD(b,a+4));


将得到什么运行结果?

对于宏定义,编译器在展开时是按源代码进行的,因此,对于上面的语句,宏MOD展开后如下所示:


b%a+4


而不是以下形式:


b%(a+4)


如果要得到上面的展开形式,宏定义则应写为:


define MOD((x),(y))(x)%(y)


参考答案:7

4.下面程序的运行结果是什么?


include<stdio.h>

define M 2

define COUNT(n)((M+1)*n)

void main()

{

int x;

x=2*(M+COUNT(2+1));

printf(“x=%d\n”,x);

}


以上程序使用了两个宏,其中第2个宏中又包含第1个宏,第2个宏替换为如下形式:


define COUNT(n)((2+1)*n)



define COUNT(n)(3*n)


则变量x中进行宏替换后得到如下形式注意2+1是先计算后再替换的:


x=2(2+(33));


参考答案:x=18