预处理,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<cstdio>
#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))