我懂啦 宏定义与函数实现数的平方差异的原因(分享下) 大神勿喷哈!
#include <stdio.h>void main()
{
int i=1;
int SQ(int y);
while(i<=5)
{
printf("%d\n",SQ(i++));
}
}
int SQ(int y)
{
return ((y)*(y));
}
这个是函数实现数的平方的代码输出 1491625
#include <stdio.h>
#define SQ(y) ((y)*(y))
void main()
{
int i=1;
while(i<=5)
{
printf("%d\n",SQ(i++));
}
}
这个是用宏来实现的但是输出的结果却是 1925
原因 //SQ(i++)→((i++)*(i++)) 因为这里 i自增了2 所以与函数实现的结果不同!! 自己小小顶一下! 没人...... 楼主思路很独特 小甲鱼老师在视频里的例子,很典型。 感谢楼主 谢谢哈 本帖最后由 風言瘋語 于 2012-11-17 22:01 编辑
用函数的话先把i自加1然后把自加的值付给y
用宏定义把i++这个表达式赋给y
你可以写一个没有副作用的宏函数 mark
用函数的话先把i自加1然后把自加的值付给y
用宏定义把i++这个表达式赋给y 赞 没懂 哈哈,刚学了小甲鱼老师讲的高级宏定义,视频里举了这个例子,说课后作业里有这个答案,然而......
于是坛里搜了一下,发现前辈们竟然早在6年前就解答了这个问题{:10_257:}
因为老师讲得比较简单,就度娘研究了一下,发现好像需要写成:
#define SQ(Y)( { __typeof__(Y) _y = (Y); _y * _y; } )
这样无论是i++或者++i就都输出正确的平方数了。
页:
[1]