Scope and extent - 作用域和生存周期

The scope of a variable describes where in a program's text the variable may be used, while the extent (or lifetime) describes when in a program's execution a variable has a (meaningful) value.

Extent, on the other hand, is a runtime (dynamic) aspect of a variable. Each binding of a variable to a value can have its own extent at runtime.

/*
Description:
	Scope and Extent
        with Function Call
Author:  Liutong Xu
*/


#include<stdio.h>
int fa(int a, int b);
int fb(int a, int b);
int rf(int n);
int main()
{
	int imain;
	imain = 10;
	printf("in main: imain = %d\n", imain);

	{//block 1
		int v1;
		v1 = 1;
		printf("in block 1: v1 = %d\n",v1);
		printf("in block 1: imain = %d\n", imain);
	}
	{//block 2
		int v2;
		v2 = 2;
		printf("in block 2: v2 = %d\n", v2);
		printf("in block 2: imain = %d\n", imain);

		int v1;
		v1 = 3;
		printf("in block 2: v1 = %d\n",v1);
	}
	//in main()
	int v2;
	v2 = 5;
	printf("in main: v2 = %d\n",v2);


	// printf("in main: v3 = %d\n",v3);
	// int v3;
	// v3 = 6;

	// scope with function call
	int temp;
	temp = fa(imain, v2);
	printf("Function fa returned a value: %d\n", temp);

	printf("\nCalling recursive function factorial of 10\n");
	printf("The factorial of %d = %d\n",imain,rf(imain));

	return 0;
}

int fa(int a, int b)
{
	int va = 16;
	printf("in fa: va = %d\n",va);

	b++;

	//in function call another function
	//in function fa(), called by main(), call function fb()
	fb(a,b);

	return va + a + b;
}

int fb(int a, int b)
{
	int vb = 625;
	//int i = 123;
	printf("in fb: vb = %d\n", vb);

	// print va from function fa
	// printf("in fb: va from function fa = %d\n",va);		//??

	return vb + a + b;
}

int rf(int n)		//recursive function for calculating factorial of n
{
	static int level = 0;		//count for recursive level
	int fac;
	int j;		//for loop count
	level++;

	printf("\n");
	for (j = 0; j < level; j++) printf("  ");
	printf("n's value is %d\n", n);
	for (j = 0; j < level; j++) printf("  ");
	printf("n's address is %p\n", &n);

	if (n == 0)
	{
		return 1;
	}
	else
	{
		for (j = 0; j < level; j++) printf("  ");
		printf("-- calling factorial of %d\n", n - 1);

		fac = rf(n - 1);

		level--;
		printf("\n");
		for (j = 0; j < level;j++) printf("  ");
		printf("-- return from %d\n", n - 1);
		for (j = 0; j < level; j++) printf("  ");
		printf("%d! = %d\n", n - 1, fac);

		return n * fac;
	}
}

stdout

in main: imain = 10
in block 1: v1 = 1
in block 1: imain = 10
in block 2: v2 = 2
in block 2: imain = 10
in block 2: v1 = 3
in main: v2 = 5
in fa: va = 16
in fb: vb = 625
Function fa returned a value: 32

You have no rights to post comments