五、实参求值的顺序
#include <stdio.h>
void main()
{ int f(int a,int b);
int I=2,p;
p=f(I,++I);
printf("%d",p);}
int f(int a,int b)
{ int c;
if(a>b) c=1;
else if(a==b) c=0;
else c=-1;
return(c) ;
}
湖北专升本考试题目中通常按:大端序 将参数从右向左依次压入栈。
分析:如果从左到右顺序求实参的值,f(2,3),程序运行的结果为 -1
本题按从右到左的顺序求实参的值,f(3,3),程序运行的结果为 0
六、函数的递归调用
有 5 个人坐在一起,问第 5 个人多少岁?
他说比第 4 个人大 2 岁。
第 4 个人比第 3 个人大 2 岁。
第 3 个人比第 2 个人大 2 岁。
第 2 个人比第 1 个人大 2 岁。
第 1 个人 10 岁。
#include <stdio.h>
int age(int n)
{ int c;
if(n==1) /*n表示第一个人*/
c=10;
else
c=age(n-1)+2;
return(c);
}
void main()
{printf("%d",age(5));}
age(5) 5 是实参,传递值给形参 n
c = age(5-1) + 2 = age(4) + 2
当 n==1 时,第一个人的年龄 c=10
age(2) = age(1) + 2 = 12
age(3) = age(2) + 2 = 14
age(4) = age(3) + 2 = 16
age(5) = age(4) + 2 = 18
七、数组作为函数参数
注:数组名也可以作实参和形参,传递的是数组首元素的地址。
例:有一个一维数组 score,内放 10 个学生成绩,求平均成绩
#include <stdio.h>
int main()
{ float average(float array[10]);
float score[10],aver;
int I;
for(I=0;I<10;I++)
scanf("%f",&score[I]); aver = average(score);
printf("%f",aver);}
float average(float array[10])
{ int I;
float aver,sum=array[0];
for(I=1;I<10;I++)
sum=sum+array[I];
aver=sum/10;
return(aver);}
八、局部变量和全局变量
(1) 局部变量:在一个函数内部定义的变量,只能在本函数内使用。
(2) 全局变量:从定义变量的位置开始到本源文件结束。
第一种:外部变量(全局变量)和局部变量同名,在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
#include <stdio.h>
int a=3,b=5;
int main(){
int max(int a,int b);
int a=8;
printf("%d",max(a,b));
return 0;
}
int max(int a,int b)
{ int c;
c=a>b?a:b;
return(c);}
//a=8;
九、auto 变量
自动变量
十、用 static 声明局部变量(或 register)——累加值
main()
{ int f(int);
int a=2,I;
for(I=0;I<3;I++)
printf("%d",f(a));}
int f(int a)
{ auto int b=0;
static int c=3;
b=b+1;
c=c+1;
return(a+b+c);}

十一、内部函数和外部函数
内部函数:
static 类型标识符 函数名(形参表);
外部函数:
extern 类型标识符 函数名(形参表);
习题: