关于C中自增自减的问题

发布时间:2024-11-06 08:08 发布:上海旅游网

问题描述:

#include<stdio.h>
void main()
{
int a;
a=3;
printf("%d%d%d\n",a,a++,a);
}
在我想不管是从左至右运算还是从右至左运算,结果应该输出:
334 或者433
可为什么它却输出的是333??

问题解答:

编译器优化了....将原来的程序段分成两步:
a++;
printf("%d%d%d\n",a,a,a);

不同的编译器优化结果不同,如果没有优化则根据函数的参数入栈前缀决定 (_stdcall,_cdel,_fastcall 等)

因为在printf函数中参数(如你写的a,a++,a)是按值传递的,也就是说该函数存储的是变量a的一个copy(副本)。当你把参数传给printf时该函数自动生成不同的temp变量来存储不同的传递值(在你的例子中生成了3个temp量分别存储a,a++和a)。所以++作用符作用的其实是temp++,所以a值不变。

你若把a++提前用另一个变量“接收”一下,再输出这个变量时,就出现你认为的那种结果了。
楼上的说的对,在你输出时,a值已进行了copy存储。

就是333,它说printf("%d%d%d\n",a,a++,a); a=3,而a++就是取a的值,然后再加1啊,所以是3,3,3

同意newghost_joe,反正再输出语句中改变输出的变量值,类似于这样不能保证先输出a的值后,再进行自加运算!

Java的输出结果和C的不一样。不过楼上的各位说的真是令人佩服,以前我还不知道有此一说。楼主对这些也不必太较真,有些东西就是知其然而不知其所以然的,有的编译器也不是完美无缺的。

热点新闻