我们先来看第一个例子
#include<stdio.h>
void fun(int a,int b,int c)
{
printf("%d,%d,%d", a, b, c);
}
void main()
{
int a = 3;
fun(a++, a++, a++);
}
输出:5,4,3
得出结论:函数参数是从右往左入栈的。
那么为什么是从右往左呢,那是因为c语言有可变参数的功能。C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数,C语言中可变参数都是从左到右,所以不管你有多少个参数反正将最右面的那个压入栈底,最左面的参数出入栈顶。
第二个例子:
#include<stdio.h>
int main(void)
{
int i = 0;
printf("%d,%d,%d,%d,%d\n", ++i, ++i, i++, ++i, i++);
}
输出结果:
5,5,2,5,0
原因如下:
首先执行顺序是从右向左执行的。先处理i++,在处理后面的。如果是i++那么表示符合从右向左处理的前提下,当即处理该参数。如果是++i,那么表示只是执行++i运算并不将结果作为参数结果,将参数位置压入堆栈,只有当所有参数从右向左处理完毕之后,从堆栈弹出所有因为延后操作语句而没有填入最终结果的参数位置,将最终执行的结果i,作为相应的参数值,填入进去。
第三个例子:
int a = 3,b = 5,c;
c = a>b,a+b; //c = 0
原因:都好运算符的优先级低于赋值运算符,所以先将a>b 值为0的值给c,之后进行a+b运算,结果不保存
c = (a>b,a+b) // c= 8
原因:因为括号的优先级高于赋值运算符,所以先算括号内的表达式,此时计算结果为最后一个表达式的值,即a+b