c语言++操作符与函数调用的问题
Published on
假设有如下c函数:
void func(int a, int b, int c)
{
printf("%d,%d,%d\n",a,b,c);
}
使用如下方式调用:
int i=0;
func(i++, i++, i++);
希望的输出是:
0,1,2
但是实际输出是:
2,1,0
分析原因,应该是由于c语言的参数压栈顺序为从右向左,因此实际执行的过程是:
int i = 0;
int c = i;
i = i + 1;
int b = i;
i = i + 1;
int a = i;
i = i + 1;
func(a, b, c);
但是如果使用如下方式调用:
int i=0;
func(++i, ++i, ++i);
输出却是:
3,3,3
其原因猜测是因为,与i++不同,++i操作没有生成临时变量,因此最后使用的是同一个i。其执行过程如下:
int i = 0;
i = i + 1;
i = i + 1;
i = i + 1;
func(i, i, i);
为了验证以上猜想,考虑如下调用:
int i=0;
func(i++, ++i, i++);
实际执行过程是:
int i = 0;
int c = i;
i = i + 1;
i = i + 1;
int a = i;
i = i + 1;
func(a, i, c);
因此输出应该为:
2,3,0
这与实际输出一致。
备注:以上测试使用的编译器为gcc 9.3.0,实际结果可能因为不同编译器的实现方式不同而不同。