如图、C语言有关带参宏的问题,这个计算出来的结果为什么是1,9,25?
答案:3 悬赏:80 手机版
解决时间 2021-11-14 19:21
- 提问者网友:聂風
- 2021-11-14 10:18
如图、C语言有关带参宏的问题,这个计算出来的结果为什么是1,9,25?
最佳答案
- 五星知识达人网友:逐風
- 2021-11-14 11:24
SQ(i++)经过预编译之后被替换成:
((i++) * (i++))
所以结果每次都被多加了1,所以使用宏定义的时候要小心这类问题,跟函数调用是完全不同的追问函数调用和这个形式是一样的啊,为什么这个比函数调用每次多加了1呢?追答解释过了,宏定义的内容经过预编译先将宏定义替换为实际的内容,所以
printf("%d\n", SQ(i++);
这句被预编译器重新生成为:
printf("%d\n", ((i++) * (i++));
也就是说预编译后生成的源代码变成了后面的样子,这两个句子是等同的,只是预编译器帮你做了替换。
((i++) * (i++))
所以结果每次都被多加了1,所以使用宏定义的时候要小心这类问题,跟函数调用是完全不同的追问函数调用和这个形式是一样的啊,为什么这个比函数调用每次多加了1呢?追答解释过了,宏定义的内容经过预编译先将宏定义替换为实际的内容,所以
printf("%d\n", SQ(i++);
这句被预编译器重新生成为:
printf("%d\n", ((i++) * (i++));
也就是说预编译后生成的源代码变成了后面的样子,这两个句子是等同的,只是预编译器帮你做了替换。
全部回答
- 1楼网友:酒醒三更
- 2021-11-14 13:41
是这么算的i=1是SQ(1*1)=1 这时候执行i++,i=2,然后在执行i++ i=3;然后进入while循环然后SQ(3*3)=9;然后两次i++;i=5;第三次while循环,SQ(5*5)=25; 第四次两次i++ i=7
退出循环,就是把SQ(i++)执行时用((i++)*(i++))替代,即每循环一次,执行两次i++,懂了吧追问我还是有点儿不懂,,这样每次计算的时候不是i已经自加了一次再相乘么?那第一次计算结果不会变成1*2=2么?
退出循环,就是把SQ(i++)执行时用((i++)*(i++))替代,即每循环一次,执行两次i++,懂了吧追问我还是有点儿不懂,,这样每次计算的时候不是i已经自加了一次再相乘么?那第一次计算结果不会变成1*2=2么?
- 2楼网友:底特律间谍
- 2021-11-14 12:01
你调用SQ(i++)的时候
是这样执行的((i++)*(i++))
i自加了两次,这样结果你就明白了追问自加两次那第一次执行的时候不就变成1*2了么?
是这样执行的((i++)*(i++))
i自加了两次,这样结果你就明白了追问自加两次那第一次执行的时候不就变成1*2了么?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯