paul hewitt怎么样:C语言的一个计算问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/30 00:12:42
我是一名初学C语言的菜鸟,请教大虾一个简单的问题:
main()
{
int j=2;
printf("j=%d,(j++)+(j++)+(j++)=%d\n",j,(j++)+(j++)+(j++));
j=2;
printf("j=%d,(++j)+(++j)+(++j)=%d\n",j,(++j)+(++j)+(++j));
}
在这个程序中,为什么运行的结果为:
j=5, (j++)+(j++)+(j++)=9
j=5, (++j)+(++j)+(++j)=12
但一楼的也不对呀?为什么j的值显示为5?
还有,第二个为什么计算后的值为12,j不已经初始化为2了么?

其实你可以尝试着先打印出(j++)再打印出(j++)+(j++)最后再打印出(j++)+(j++)+(j++)你就差不多都明白了。
printf("j=%d,(j++)=%d\n",j,(j++));可以看到打印出的j=3,(j++)=2 。
printf("j=%d,(j++)+(j++)=%d\n",j,(j++)+(j++)); 打印出的是j=4,(j++)+(j++)=5。这里在第一个j++是2的基础上加1,所以2加3得5
printf("j=%d,(j++)+(j++)+(j++)=%d\n",j,(j++)+(j++)+(j++)); 这里就是你的结果了,j=5,基于前面的结果2+3+4=9
至于第二条++在前的话就是3+4+5=12

这里的主要原因是printf语句中是一个表达式形成的变量,他是一步步算过来的,并不是如同一个赋值表达式先整体的算好后自加。如果你这里添加一个变量i的话,i=(j++)+(j++)+(j++);那么大家都知道i是等于6的,因为它是先用j=2的值运算完后再自加得5。而在printf语句中直接以(j++)+(j++)+(j++)作变量代入的话,它的计算过程就不是这样了,是一个个算过来的,第一个j++返回值为2,但是它作了一次++运算后影响到了第二个j++,使它的返回值为3。

c语言现在都有点模糊了,但我还记得j++是先运算后再加1的,++j 是先加1后再运算的,因此j++在本条语句中依然为j值,在下一条语句中才为j+1(语句之间是以分号来间隔开的),但在++j中本条语句已经是j+1了.因此(++j)+(++j)+(++j)比(j++)+(j++)+(j++)多3

printf是函数调用,那就应该算计算括号里面的,先算完之后才把数值传到函数里面的语句进行处理,所以最后的j=5,而后面的(j++)+(j++)+(j++)就是2+3+4=9,括号里面应该是属于逗号运算,所以是先算(j++)+(j++)+(j++).我说的是第一个printf语句.下面的类似.我的回答不是很完美.不知道谁还有更合理的解释,提出来参考

前面的每一个(j++)是先用后加,后面的(++j)是先加后用,因此前面的结果是2+3+4=9了,j 加了三次。而后面的是3+4+5=12,同样的j 也加了三次。