C语言递增递减运算的问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 15:18:09
请专业一点,十分明白的大师来回答一下。
main()
{int i=5,j=5,p,a;
p=(i++)+(i++)+(i++);
a=(++j)+(++j)+(++j);
printf("i%d,p%d,j%d,a%d",i,p,j,a);}
main()
{int j=2;
printf("j=%d,j++=%d\n",j,(j++)+(j++)+(j++));
j=2;
printf("j=%d,++j=%d\n",j,(++j)+(++j)+(++j));}
请回答一下这两个程序递增的不同?
分别得出来的数是怎么样运算的?
运算过程是什么?
及详细的解答?

//因为C目前没有绝对的标准,K&R标准仅仅是比较经典的,
//所以编译器不同,执行结果可能不同,不过可以分析一下:
//首先,i++是先调用i然后再自增,所以:p=(i++)+(i++)+(i++);这个,先算
p=i+i+i; /*然后i自增*/ i++,i++,i++;//所以i是8
而++j刚好相反,先自增,然后再调用,所以是先执行
++j,++j,++j;/*然后再执行*/a=j+j+j;
//所以结果是24(TC上的执行结果,VC上未必是这个,
//就好象一楼的老兄,他的编译器运行a是22(起码c-free是这个)
//——虽然我实在是不明白这个数是怎么得到的)
//至于第2个main(),也可以这么考虑——还是那句话,这个问题在
//不同编译器上运行,会有不同结果。

前一个结果是 i8,p15,j8,a22
后一个结果是j=2,j++=6
j=5,++j=13

这是C++之父也解决不了的问题,醒悟吧。

这个本来就没有确定的顺序,你不能确定,(j++)+(j++)+(j++)的顺序的,因为在标准里面都没有标准的规定,所以怎么说都不能说是错的,在各个平台里面的结果会不同的,c里面只有四个操作符是有运算顺序的,注意是运算顺序,不是结合顺序,那就是&& || , ?:希望你能明白

++i与i++的区别一个是先增后计算,另一个是先计算后增。那么进行混合运算时的运算顺序要牚握的是:++运算符,即是一个自增运算符---单目运算符(单目运算符的优先级高于双目运算符和三目运算符),又是一个复合赋值运算符(赋值运算符的优先级仅高于逗号运算符);所以,++在前面,把它理解为单目运算符,先计算;而把++在后面的理解为复合赋值运算符,优先级倒数第二。
上面可能写的太多,但是看明白了的话就知道怎么回事了,以后这样的题也就知道怎么做了。

你不给分,后面的就先不说了