关于宏函数解决思路

关于宏函数
#define f(x) x*x
main( )
 { int i;
  i=f(4+4)/f(2+2);
  printf("%d\n",i);
 }  
运行结果感觉应该是3,但是为什么会是28呢···

------解决方案--------------------
宏是直接替换,f(4+4)是4+4*4+4。下同
------解决方案--------------------
#define f(x) (x)*(x)
------解决方案--------------------
探讨

宏是直接替换,f(4+4)是4+4*4+4。下同

------解决方案--------------------
宏替换是等价替换,如果需要获取你想要的结果需要加上括号,不要吝啬你的括号,
#define f(x) (x)*(x)
------解决方案--------------------
宏,先展开再计算。
如果实在想不清楚,就先在代码里,把宏的代码在脑袋里替换一遍。
------解决方案--------------------
宏只是替换,一定要注意括号的使用,宏在使用过程中很容易出问题,尽量避免使用宏,除非对宏理解深入了,如果是C++编程,建议使用内联函数来代替宏。i=f(4+4)/f(2+2);使用宏替换后为:i=4+4*4+4/2+2*2+2=28,如果此题目真想使用宏,应该将宏定义为:#define f(x) (x)*(x)
------解决方案--------------------
#define f(x) ((x)*(x))
------解决方案--------------------

gcc -E test.c -o test.i 比较下生成的代码看看


#define f(x) ((x)*(x)) 括号多加
------解决方案--------------------
没有括号。。。,
------解决方案--------------------
宏是直接替换,不像函数的参数
------解决方案--------------------
6楼正解,i=f(4+4)/f(2+2);使用宏替换后为:i=4+4*4+4/2+2*2+2=28
我再加些知识:
在C语言中用宏代码提高执行效率,预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度;但是缺点很大,容易出错,比如你上面的例子就出现了意想不到的边际效应。
在C++中建议使用内联函数,它是直接把代码复制过去,省去了函数调用的开销,从而提高了函数的调用效率。而且内联函数还增加了安全性(在调用一个函数的时候,编译器首先要检查调用是否正确,进行类型安全检查或者进行自动类型转换)

------解决方案--------------------
#define f(x) ((x)*(x))
------解决方案--------------------
探讨
gcc -E test.c -o test.i 比较下生成的代码看看


#define f(x) ((x)*(x)) 括号多加