
分析变量作用域的程序举例
程序1:
#include<stdio.h>
#define NN 8
int Num[NN]={5,10,8,3,4,12,7,2};
int Sum() {
int i,s=0;
for(i=0; i<NN; i++) s+=Num[i];
return s;
} //函数功能:求出并返回全局数组Num[NN]中的所有元素之和。
int Max() {
int i,m=Num[0];
for(i=1; i<NN; i++)
if(Num[i]>m) m=Num[i];
return m;
} //函数功能:求出并返回全局数组Num[NN]中所有元素的最大值。
void main() {
int c;
c=Sum()+2*Max(); //51+2*12=75
printf("c=%d\n",c); //c=75
} //int Num[NN]={5,10,8,3,4,12,7,2};
程序2:
#include<stdio.h>
int Mul(int a[], int n); //函数声明
void main() {
int b[5]={1,2,3,4,5};
int r1,r2;
r1=Mul(b,5); //返回值120
r2=Mul(b+2,3); //返回值60
printf("r1=%d, r2=%d\n",r1,r2);
} //输出:r1=120, r2=60
int Mul(int a[], int n) { //a为数组,n为数组长度
int i,p=1; // p作为累乘变量。
for(i=0; i<n; i++) p*=a[i]; //求a数组中n个元素之积
return p;
}
程序3:
#include<stdio.h>
int x=10;
void main() {
int y=20;
printf("x=%d, y=%d\n",x,y);
{ //一条复合语句
int x=30;
y=y+x;
printf("x=%d, y=%d\n",x,y);
//输出:x=30, y=50
}
printf("x=%d, y=%d\n",x,y);
//输出:x=10, y=50
} //y作用域到此结束
注意:在不同作用域内可以定义同名变量,内层优先于外层。
程序4:
#include<stdio.h>
int Cdiv(int m, int n)
{ //求出并返回m和n的最大公约数
int r;
if(m<n) {r=m; m=n; n=r;}
while(r = m%n) {m=n; n=r;}
return n; //返回最大公约数n的值
} //若m和n的初始值为20和12,1次循环后m=12,n=8;2次循环后m=8,n=4;第3次判断r = m%n时r值为0。最大公约数为当前n的值4。
void main() {
int m,n; //m和n只作用于主函数
printf("输入两个正整数: ");
scanf("%d %d",&m,&n);
printf("%d 和 %d 的最大公约数为: %d\n", m,n,Cdiv(m,n));
//m和n的值分别对应传送给Cdiv()函数的参数表中的m和n
}
程序运行结果:
输入两个正整数: 25 40
25 和 40 的最大公约数为: 5
程序5:
include<stdio.h>
void xk2(); //函数声明
void xk2() { //函数定义
int a=0; //a为自动变量
static int b=0; //b为静态变量
a++; b++; //a变为1,b增加1
printf("a=%d, b=%d\n",a,b);
}
void main() {
int i;
for(i=1; i<=4; i++) xk2();
}
运行结果:
a=1, b=1
a=1, b=2
a=1, b=3
a=1, b=4
程序6:
#include<stdio.h>
#define N 6
void Swop(int *x, int *y) {
int w=*x; *x=*y; *y=w;
}
void main() {
int i, a[N]={1,2,3,4,5,6};
for(i=0; i<N/2; i++) Swop(a+i, a+N-1-i);
for(i=0; i<N; i++) printf("%d ", a[i]);
printf("\n");
} //输出结果:6 5 4 3 2 1