关于++运算符的困惑。

来源:百度知道 编辑:UC知道 时间:2024/05/30 13:29:19
int i=3,j=3;
printf("%d,%d,%d,%d\n",i++,i++,++i,++i);
cout<<j++<<j++<<++j<<++j<<endl;

在Visual Studio 2008 中作为C++ 控制台程序编译 输出结果:
5,5,5,5
5577

谁能解释一下为什么是这个结果?

首先要说明的是,在输出之前,是先要计算完所有参数值的,而在vc6.0的编译器里,所有的参数是按照逆序压入函数栈的。
下面解释你的例子:
printf()是函数,有四个参数,我们记为:i++(1)i++(2)++i(3)++i(4);
调用函数时候,参数按照4321的顺序压栈。也就是先计算(4)的值,由于i=3而且采用的是前置++,所以输出的最后一个数字是4;下面计算(3)的值,由于(4)中i=4,前置++,结果输出倒数第二个数字为:5.下面计算(2)的值,由于此时采用后置++,所以输出的倒数第三个数字也为5,但是此时i=6;当计算(1)的值时候,就只输出第一个数字为6了。
你不要奇怪,之所以结果不同,那是由于编译器的关系。以及函数参数的压栈顺序。我说的这些虽然跟你的答案不同,目的是给你一个思路,从编译器和函数栈的方式考虑。
另外,其实没有必要这样深究,因为这样已经超过语言的层次了。以后编程时候不采用这种习惯就好。只有一个参数的话,或者参数不带副作用的话,它怎么压栈又怎么会影响到结果呢?
希望你可以明白。。。
有疑问的话:dacer250@gmail.com

j++先输出再+1
++j先+1再输出

gcc的结果:
6,5,7,7
6577

说明:和编译器有关

晕,为什么 我的结果是:
5,5,5,4
6554

我用的是VC++6。0