鱼C论坛

 找回密码
 立即注册
查看: 3458|回复: 4

菜鸟关于自增自减的问题

[复制链接]
发表于 2013-2-14 18:07:08 | 显示全部楼层 |阅读模式
1鱼币
void main(void){
int i=5,j=5,p,q,m,n;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
    m=(i--)+(i--)+(i--);
n=(--j)+(--j)+(--j);
printf("%d,%d,%d,%d\n",m,n,i,j);

}
代码的结果是
15,22,8,8
24,17,5,5
我主要不太明白那个22 和17是怎么得来的,求大神解答

最佳答案

查看完整内容

先讲你主要不明白的(其他估计你也知道,附在后面你可以直接无视) 这里不讲汇编了,也没必要。 首先是那个22的 看反汇编它是这么做的 q=(++j)+(++j)+(++j) 先自增j两次,这时j=5+1+1=7 然后两个相加j+j=7+7=14 继续自增j,j=7+1=8 最后q=14+8=22 我不知道为什么,很多鱼油说是编译器优化的结果,我也不懂,那就是吧。 跟上面是差不多的 经过这条 q=(++j)+(++j)+(++j)后j=8 那么 n=(--j)+(--j)+(--j);就是这样 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-14 18:07:09 | 显示全部楼层

先讲你主要不明白的(其他估计你也知道,附在后面你可以直接无视)
这里不讲汇编了,也没必要。
首先是那个22的
看反汇编它是这么做的
q=(++j)+(++j)+(++j)
先自增j两次,这时j=5+1+1=7
然后两个相加j+j=7+7=14
继续自增j,j=7+1=8
最后q=14+8=22

我不知道为什么,很多鱼油说是编译器优化的结果,我也不懂,那就是吧。

跟上面是差不多的
经过这条
q=(++j)+(++j)+(++j)后j=8
那么
n=(--j)+(--j)+(--j);就是这样
就是先自减2次j=8-1-1=6
然后两个相加6+6=12
继续自减j,j=6-1=5
最后相加n=12+5=17







可无视部分:
p=(i++)+(i++)+(i++);
m=(i--)+(i--)+(i--);
就是先进行相加运算,然后在一次性连续三次自增自减

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-14 19:48:15 | 显示全部楼层

谢谢你,我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-15 23:52:47 | 显示全部楼层
楼主  既然 和我一样初学就要听老师的话  先不要区别前自增和后自增的区别 (规避掉) 也就是说 比如写i++; 吧自增当成一个大语句 不要当成一个大语句中的一个组成部分 比如 和你差不多的 printf("%d %d %d %d",i++, ++i, --i, i--);  第一种 i++;王权等于++i;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-13 17:37:17 | 显示全部楼层
2楼解释的让人“知其然,不知所以然”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 00:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表