Wang's blog

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,实际结果可能因为不同编译器的实现方式不同而不同。