关于宏的C语言面试题
1 #define sqr(x) x*x 2 int main() 3 { 4 int a=10,k=2,m=1; 5 a/=sqr(k+m)/sqr(k+m); 6 printf("%d\n",a) 7 return 0; 8 9 }
(1)运行程序有什么结果;
(2)运用宏定义有什么好处;
答:(1)a=1;
a /=k+m*k+m / k+m*k+m,即 a = a / 7 = 1
宏替换换是只替换不组合,直接进行文本替换,它不是函数,替换文本后直接按照规定的加减乘除等级计算,比如这个题的sqr(k+m)=k+m*k+m,按照乘法优先选择,就是先算m*k再算加法.(a为整型自动取整)
(2)
宏定义的好处:
1. 提高了程序的可读性,同时也方便进行修改;
2. 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率;
3. 宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。比如##连接符。
但是它也有自己的缺点:
1. 由于是直接嵌入的,所以代码可能相对多一点;
2. 嵌套定义过多可能会影响程序的可读性,而且很容易出错;
3. 对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
补充:预编译语句仅仅是简单的值代替,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患。
最后,引用《C陷进与缺陷》的一句话,对其进行总结:
宏并不是函数,宏并不是语句,宏并不是类型定义

浙公网安备 33010602011771号