第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