宏定义

                  预处理问题、const问题和sizeof问题是C++设计语言中的三大难点,也是各大企业面试中反复出现的问题。就sizeof问题而言,我们曾在十几家公司、几十套题目中发现它的存在。

   面试题1:下面代码输出结果是什么?   

   #define SUB(x,y)  x-y

   #define ACCESS_BEFORE(element, offset, value)  *SUB(&element,offset) = value

   int main()

{

   int i;

   int array[10] = {1,2,3,4,5,6,7,8,9,10};

   ACCESS_BEFORE(array[5], 4, 6);

   for(i= 0, i<10; ++i)

printf("%d",array[i]);

}

return0;

 }

A: 1 6 3 4 5 6 7 8 9 10       B 6 2 3 4 5 6 7 8 9 10

C  程序可以正确编译,但是运行时会崩溃

D  程序语法错误,编译不成功

解析: 宏的那句被预处理器替换成:*&array[5]-4 = 6;

 由于减号比赋值优先级高,因此先处理减号;由于减号返回一个数而不是合法值,所以编译报错

答案:C    //这个没搞明白

 面试题2:用预处理指令#define声明一个常数,用于表明一年中有多少秒?(忽略闰年问题)

解析: 通过这道题面试官想考以下几个知识点:

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

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

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

           如果子啊表达式中用到UL(表示无符号长整型),那么你就有一个好的起点,第一印象很重要

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

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

 解析:

          这个测试时为下面的目的而设的:

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

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

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

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


  

你可能感兴趣的:(程序员面试宝典题)