一、问题的产生
对于一般情况下的函数传参,没有太多讨论价值,例如:
#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。