一道关于宏的面试题及解答

    技术2022-05-11  24

    一道关于宏的面试题及解答

    【题目】#include   <stdio.h> #define   SQR(X)   X*X

    int   main(int   argc,   char*   argv[]) { int   a   =   10; int   k   =   2; int   m   =   1;

    a   /=   SQR(k+m)/SQR(k+m);   printf( "%d/n ",a);  

    return   0; } 这道题目的结果是什么?

    【解答】典型错误1:SQR(k+m)/SQR(k+m) = 1;最后得到a = 10;原因:#define 只是定义而已,在编译前会将#define定义的内容进行替换,然后进行编译。这一点与函数大不相同。结果认为是10,很可能将SQR这个宏定义当作函数来用了。

    典型错误2:进行宏替换,得:a   /=   (k+m)*(k+m)/(k+m)*(k+m); => a   /=   (k+m)*1*(k+m); => a   =   a/9; => a   =   1; 原因:宏替换是按照宏定义进行的严格不变的替换,所以上面的替换结果应该为:a   /=   k+m*k+m/k+m*k+m;=> a /= 2+1*2+1/2+1*2+2;=> a /= 7;=> a = 1;

    【评析】该题目主要考查两点:1、慎用宏定义,如果需要用宏,考虑是否可以通过函数,模板,或const定义等代替之。例如本题,使用函数实现可以轻松避免以上问题。2、宏定义的方式:在所有参数上一定要加括号。本题中#define SQR(X) X*X 就属于不良风格的宏定义方式,良好的风格应该为:#define SQR(X) (X)*(X),这样,计算的结果就是a   /=   (k+m)*(k+m)/(k+m)*(k+m),最后结果仍为1。或者定义为:#define SQR(X) ((X)*(X)),这样最后的结果是10。

     

    最新回复(0)