一、问题的产生

对于一般情况下的函数传参,没有太多讨论价值,例如:

#include <stdio.h>
int main()
{
 int x=3,y=4;
 printf("%d,%d",x,y);
}

上例输出为3,4。分析时,认为先传值x和先传值y都可以,不影响结果。因此,对于这种传递不带自增的多变量传递,没有太多必要讨论。

但是对于带有自增和自减的单变量参数传递,则有详细分析的必要。

例如:

#include <stdio.h>
int main()
{
 int x=3;
 printf("%d,%d",x,x++);
}

上例输出为4,3。则分析该结果时,有必要从参数传递的次序和如何传值进行考虑。

以下分析在Dev-C++和Microsoft Visual C++ 2010 Express中均通过验证。

二、传参规则

1、传参方向:从右向左。

2、依次计算后自增或者后自减,并传值。

3、计算先自增或者先自减,最后和不计算的变量统一传值。

三、分析详解

例题1:

#include <stdio.h>
int main()
{
 int x=3;
 printf("%d,%d,%d",x++,x,x++); 
}

本题从右向左计算第3个和第1个参数x并传值,第2个参数x最后传值。故第3个x先赋值3,然后自增为4;第1个x赋值4,再自增为5;最后第2个x传值5。因此,输出为4,5,3。

例题2:

#include <stdio.h>
int main()
{
 int x=3;
 printf("%d,%d,%d,%d,%d,%d",x++,++x,x,++x,x,x++);
}

本题从右向左依次计算第5,4,2,1四个参数。第6个先赋值3,然后自增为4;第4个自增为5;第2个自增为6;第1个先赋值为6,然后自增为7;最后第2,3,4,5四个参数统一传值为7。因此,输出为6,7,7,7,7,3。

例题3:

#include <stdio.h>
int main()
{
 int x=3;
 printf("%d,%d,%d,%d,%d,%d",++x,x,x++,x++,++x,x);
}

本题从右向左传参依次计算第5,4,3,1四个参数。第5个自增为4;第4个先赋值4,然后自增为5;第3个先赋值5,然后自增为6;第1个自增为7;最后第1,2,5,6四个参数统一传值为7。因此,输出为7,7,5,4,7,7。