6.5 程序的执行过程

仍以前面的代码为例,这里解释一下发生函数调用时程序完整的执行过程。如果对发生函数调用时程序完整的执行过程没有清晰透彻的理解,就不可能使用好函数。

如图6-1所示,是程序完整的执行过程,需要特别注意的有如下几点。

6.5 程序的执行过程 - 图1

图6-1 函数的执行过程

(1)调用函数之前总是要计算各个实参的值,这里之所以强调“值”,是因为当以一个变量名作为实参时,实参并不是那个变量本身而只是变量的一个副本,这样形参只是把变量的一个副本作为自己的初值而不是把变量本身作为自己的初值。因此无论在被调用函数的函数体内形参如何变化,都对调用处所定义的局部变量没有任何影响。如下面代码所示:

6.5 程序的执行过程 - 图2

输出的结果将是:

6.5 程序的执行过程 - 图3

而不是输出两个4。

(2)C语言没有规定计算实参的次序。类似下面这样的函数调用的结果就必定是依赖编译器的。

6.5 程序的执行过程 - 图4

这样的函数调用,由于结果赖于实参的计算次序,在具体的编译器中程序可能有确定的行为,但从C语言的角度来说,则是一个不确定的行为。从正统的C语言标准的角度来说,这种写法的语法格式是正确的,但含义是模糊的、不确定的,可以视为一种错误。这种写法的可移植性显然很差。