851248662 发表于 2012-10-5 11:44:21

我懂啦 宏定义与函数实现数的平方差异的原因(分享下) 大神勿喷哈!

#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 所以与函数实现的结果不同!!

851248662 发表于 2012-10-5 12:10:52

自己小小顶一下!

851248662 发表于 2012-10-6 21:08:24

没人......

冥顽 发表于 2012-10-10 16:42:07

楼主思路很独特

贝壳 发表于 2012-10-10 19:58:56

小甲鱼老师在视频里的例子,很典型。

低c灰太狼 发表于 2012-10-28 17:31:18

感谢楼主 谢谢哈

風言瘋語 发表于 2012-11-17 21:48:09

本帖最后由 風言瘋語 于 2012-11-17 22:01 编辑

用函数的话先把i自加1然后把自加的值付给y
用宏定义把i++这个表达式赋给y

yuye星空 发表于 2012-11-18 10:30:34

你可以写一个没有副作用的宏函数

zengyushan 发表于 2013-11-8 18:41:52

mark
用函数的话先把i自加1然后把自加的值付给y
用宏定义把i++这个表达式赋给y

小瘪四 发表于 2018-2-20 16:26:41

魔法虫虫 发表于 2018-5-11 08:34:47

没懂

他非她 发表于 2018-8-25 17:42:36

哈哈,刚学了小甲鱼老师讲的高级宏定义,视频里举了这个例子,说课后作业里有这个答案,然而......
于是坛里搜了一下,发现前辈们竟然早在6年前就解答了这个问题{:10_257:}

因为老师讲得比较简单,就度娘研究了一下,发现好像需要写成:

#define SQ(Y)( { __typeof__(Y) _y = (Y); _y * _y; } )

这样无论是i++或者++i就都输出正确的平方数了。
页: [1]
查看完整版本: 我懂啦 宏定义与函数实现数的平方差异的原因(分享下) 大神勿喷哈!