菜鸟关于自增自减的问题
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);就是这样
就是先自减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--);
就是先进行相加运算,然后在一次性连续三次自增自减
メ㊣逆ご帅☆ 发表于 2013-2-14 18:07 static/image/common/back.gif
先讲你主要不明白的(其他估计你也知道,附在后面你可以直接无视)
这里不讲汇编了,也没必要。
首先是那 ...
谢谢你,我明白了 楼主既然 和我一样初学就要听老师的话先不要区别前自增和后自增的区别 (规避掉) 也就是说 比如写i++; 吧自增当成一个大语句 不要当成一个大语句中的一个组成部分 比如 和你差不多的 printf("%d %d %d %d",i++, ++i, --i, i--);第一种 i++;王权等于++i; 2楼解释的让人“知其然,不知所以然”
页:
[1]