To call fact
, we must supply an int
value. The result of the call is also an int
:
int main()
{
int j = fact(5); // j equals 120, i.e., the result of fact(5)
cout << "5! is " << j << endl;
return 0;
}
A function call does two things: It initializes the function’s parameters from the corresponding arguments, and it transfers control to that function. Execution of the calling function is suspended and execution of the called function begins.
Execution of a function begins with the (implicit) definition and initialization of its parameters. Thus, when we call fact
, the first thing that happens is that an int
variable named val
is created. This variable is initialized by the argument in the call to fact
, which in this case is 5
.
Execution of a function ends when a return
statement is encountered. Like a function call, the return
statement does two things: It returns the value (if any) in the return
, and it transfers control out of the called function back to the calling function. The value returned by the function is used to initialize the result of the call expression. Execution continues with whatever remains of the expression in which the call appeared. Thus, our call to fact
is equivalent to the following:
int val = 5; // initialize val from the literal 5
int ret = 1; // code from the body of fact
while (val > 1)
ret *= val--;
int j = ret; // initialize j as a copy of ret