预处理问题、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))