程序员面试宝典-----(预处理,sizeof和const)

预处理,const与sizeof  (一预处理)

预处理问题,const问题和sizeof问题是C++设计语言中的三大难点,也是各大企业面试中反复出现的问题。就sizeof问题而言,我们曾在十几家公司,几十套面试题目中发现它的存在。所以本章把这三大问题单独提出来,并结合详细的分析和解释来阐述各个知识点。

1.      宏定义

面试1. What’sthe output of the following code? 

 

     #define SQR(x) (x*x)

         main()

         {

              inta,b=3;

              a=SQR(b+2);

              printf(“\n%d”,a);

     }

解析:

       完整的源代码如下,执行后输出11

       #include

       #defineSQR(x) (x*x)

       intmain()

       {

              inta,b=3;

              a=SQR(b+2);

              printf(“\n%d”,a);

              return0;

       }

       宏定义展开时候容易造成二义性问题。a=SQR(b+2)这一语句展开后为”b+2*b*2”,而并不是想象中的 “(b+2)*(b+2)”。要是想要得到这个结果,必须把宏定义语句改为如下的形式:

       #defineSQR(x) ((x)*(x))

       这样输出的结果就是25.

 

面试题2: 用预定义指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

解析:

       通过这道题面试官想考几件事情:

1.      #define 语法的基本知识(例如,不能以分号结束,括号的使用,等等)。

2.      要懂得预处理器将为你计算常数表达式的值,因此,写出你是如何计算一年中有多少秒而不是计算出实际的值,会更有意义

3.      意识到这个表达式将使得一个16位机的整形数溢出,因此要用到长整形符号L,告诉编译器这个常数是长整形数。

       如果你在你的表达式中用到了UL(表示无符号长整形),那么你就有一个好的起点。记住,第一印象很重要。

       答案: #define SECOND_PER_YEAR (60*60*24*365)UL

 

 

 

面试题3:写一个标准的宏MIN,这个宏输入两个参数,并且返回较小的那个。

解析:

       这个测试是为了下面的目的而设计的:

标识#define 在宏中的应用的基本知识。 这是很重要的, 因为直到嵌入(inline) 操作符变为标准C的一部分,宏都是方便地产生嵌入代码的唯一方法。对于嵌入式系统来说,为了能够达到要求性能,嵌入代码经常是必须的方法。

三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

       懂得在宏中小心地把参数用括号括起来。

       答案: #define MIN(A,B)((A)<=(B)?(A):(B))


你可能感兴趣的:(面试,编译器,语言,嵌入式,output,优化)