关于宏的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陷进与缺陷》的一句话,对其进行总结:

宏并不是函数,宏并不是语句,宏并不是类型定义

posted @ 2020-06-03 13:24  CYYZ凯撒  阅读(296)  评论(0)    收藏  举报