免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: FeCen
打印 上一主题 下一主题

[C] 新手问一个关于i++和++i的问题  关闭 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-05-06 09:28 |只看该作者
根编译器的实现相关:
vs 2005:
j=9,k=49
j=12,k=90
gcc:
j=9,k=49
j=12,k=73

论坛徽章:
0
22 [报告]
发表于 2009-05-06 10:01 |只看该作者

回复 #21 flyingtime 的帖子

两遍编译的标准不同,这种问题就显得很没有意义了,还是在函数里面加上括号吧

论坛徽章:
0
23 [报告]
发表于 2009-05-06 13:34 |只看该作者
#include <stdio.h>

#define FUN1(x) (x * x)
#define FUN2(x) (x * x + x)

int main()
{
int i = 3, j, k;
j = FUN1(i++);       //i++  先使用,后++, 相当于 i*i; 两次i++;   因此j=3*3=9   
k = FUN1(++i);       //++i  先++,再使用.  由于宏的作用之前两次i++, i=5. 两次++i之后,i=7. i*i=49.  K=49
printf("j = %d, k = %d\n", j, k);

i = 3;
j = FUN2(i++);       //i++  先使用,后++, 相当于 i*i+i; 三次i++;   因此j=3*3+3=12  
k = FUN2(++i);       //++i  先++,再使用.  由于宏的作用之前三次i++, i=6. 两次++i之后计算表达式i*i的值8*8=64。再做一次++i,i=9. 64+9=73.  K=73
printf("j = %d, k = %d\n", j, k);

return 0;
}



你也可以用gcc -E 看宏展开后的代码
int main()
{
int i = 3, j, k;
j = (i++ * i++);
k = (++i * ++i);
printf("j = %d, k = %d\n", j, k);

i = 3;
j = (i++ * i++ + i++);
k = (++i * ++i + ++i);
printf("j = %d, k = %d\n", j, k);

return 0;
}

论坛徽章:
0
24 [报告]
发表于 2009-05-06 13:46 |只看该作者

回复 #22 daybreakcx 的帖子

加括号也没用,清清楚楚是由实现决定的行为,括号改变的只是把 i++ 作为整体以后的运算顺序。具体哪个 i 先求,哪个 i 后求,还是先一起求了再自增,标准里压根就没说。

论坛徽章:
0
25 [报告]
发表于 2009-05-06 13:52 |只看该作者
21楼提到的不同结果问题,由于没有VS,没有办法验证。如果真如所言。 就晕了

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
26 [报告]
发表于 2009-05-06 14:03 |只看该作者
删帖吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP