函数参数函数参数在本质上与局部变量相同在栈上分配空间函数参数的初始值是函数调用时的实参值函数参数的求值顺序依赖于编译器的实现操作符的求值顺序依赖于编译器的实现(+-*/…)下面的程序输出什么?为什么呢?int k = 1;printf("%d, %d\n", k++, k++);实例分析: 函数参数的求值顺序#include <stdio.h>int func(int i, int j){ printf(“i = %d, j = %d\n”, i, j);}int main(){ int k = 1; func(k++, k++); printf("%d\n", k);}输出:【gcc】i = 2, j = 13特别说明:此处暂时没有找到有其它求值顺序的编译器来输出说明。由于C语言未明确规定函数参数的求值顺序,其交由具体的编译器厂商决定,因此为了提高程序的可移植性,不可依赖某一编译器的求值顺序行为。程序中的顺序点程序中存在一定的顺序点顺序点是指执行过程中修改变量值(内存)的最晚时刻在程序到达顺序点的时候,之前所作的一切操作必须完成C 语言中的顺序点每个完整表达式结束时,即分号处&&, ||, ?: 及 逗号表达式 的每个参数计算之后函数调用时所有实参求值完成后(进入函数体之前)下面的程序运行结束后 k 的值为多少呢?int k = 2;k = k++ + k++;编程实验: 程序中的顺序点test_1.c#include <stdio.h>int main(){ int k = 2; int a = 1; k = k++ + k ++; printf(“k = %d\n”, k); if( a– && a ) { printf(“a = %d\n”, a); } return 0;}输出【gcc】:k = 6输出【vs2010】:k = 6发生了什么?test2.c#include <stdio.h>int func(int i, int j){ printf(“i= %d, j = %d\n”, i, j); return 0;}int main(){ int k = 1; func(k++, k++); printf("%d\n", k); return 0;}输出:【gcc】i = 2, j = 13输出:【vs2010】i = 1, j = 13 小结函数的参数在栈上分配空间函数的实参并没有固定的计算次序顺序点时 C 语言中变量修改的最晚时机以上内容参考狄泰软件学院系列课程,请大家保护原创!