第十章
函数进阶
10.1函数的递归调用
#include <stdio.h>
int fac(int n);
int main(void){
printf("%d\n",fac(5));
return 0;
}
//求n的阶乘
int fac(int n){
int sum = 1;
if(n < 1){//形参的异常检查
return -1;//返回异常值-1
}
for(int i = 1;i<=n;i++){
sum = sum * i;
}
return sum;
}
//求n的阶乘递归写法
#include <stdio.h>
int fac(int n);
int main(void){
int m = 0;
printf("请输入m的值:");
scanf("%d\n",&m);
printf("%d\n",fac(m));
return 0;
}
int fac(int n){
if(n < 1){
return -1;
}else if(n == 1){
return 1;
}else{
return n*fac(n-1);
}
}
10.2作用域
#include <stdio.h>
int c = 10;//c的作用域是文件作用域
void fun(int b);
int main(void){
int a = 10;//a的作用域是函数作用域
a = 20;
{
int j = 0;//语句块作用域
j = 50;
}
return 0;
}
int fun(int b){//函数名和返回值属于文件作用域,函数的参数以及函数体属于函数作用域
a = 30;//此处报错,上面定义了a为整型,a的作用域是上面的主函数,不在该函数的适用范围
}
注意:
1.在同一个作用域内,不能出现相同的标识符,同一个作用域内不能重复定义变量名
2.一个标识符不能提示属于两个作用域,使用就近原则
#include <stdio.h>
int c = 10;//c的作用域是文件作用域,全局变量
void fun(int b);
int main(void){
int a = 10;//a的作用域是函数作用域
//int a = 20;//这样会报错,重复定义了a
a = 20;
{ //语句块作用域
int a = 20;//在这里定义a不会报错,此处a的作用域和上面的a不是同一个作用域
int j = 0;
j = 50;
}
return 0;
}
int fun(int b){//函数名和返回值属于文件作用域,函数的参数以及函数体属于函数作用域
//a = 30;//此处报错,上面定义了a为整型,a的作用域是上面的主函数,不在该函数的适用范围
}
10.3局部变量与全局变量
10.4存储类别