【C语言】生命周期和作用域

25、C语言里一个变量只能被某些语句使用,能使用某个变量的所有语句叫做那个变量的作用域

26、声明在某个函数里面的变量叫做局部变量

27、局部变量的作用域就是函数里面的所有语句

29、声明在所有函数外边的变量叫全局变量

30、全局变量的作用域包含程序里的所有语句

31、没有初始化的全局变量会自动被初始化成0

32、全局变量和局部变量可以重名,重名变量名优先代表局部变量

33、如果全局变量和局部变量都能解决问题就应该优先选用局部变量

34、存储区的使用不受作用域限制,但是受到生命周期限制

35、生命周期指一段时间,在生命周期开始的时候计算机把存储区分配给程序使用,在生命周期结束的时候计算机把存储区收回

36、全局变量的生命周期就是整个程序的执行时间

37、局部变量的生命周期是函数某一次执行的时间范围

38、当函数开始时计算机为局部变量分配存储区,当函数结束的时候计算机把局部变量的存储区收回

39、如果函数多次执行则每次执行的时候为局部变量分配的存储区都可能是新的

40、声明变量的时候可以使用static关键字,这种变量叫做静态变量

41、不论全局变量还是局部变量都可以在声明的时候使用static关键字变成静态的

42、所有静态变量的生命周期都是整个程序的执行时间

43、静态局部变量的存储区可以被其他函数使用

44、静态局部变量的作用域仍然是局部变量的作用域

45、没有初始化的静态变量自动被初始化成0

46、静态变量的初始化只在程序开始的时候执行一次,与初始化语句所在的位置无关

47、静态全局变量的作用域只包含声明它的那个文件里的所有语句(不可以跨文件使用静态全局变量)

48、变量的作用域分成三种可能,分别是局部变量,静态全局变量和非静态全局变量

49、变量的生命周期分成两种可能,分别是非静态局部变量和其他

/*
 * 作用域
 * */
#include <stdio.h>
/*auto*/ int x = 1000;// 定义一个全局变量 auto可有可无
void f1(int a)
{
    a = 10;
    auto int x = 20;  //全局和局部同时存在时,全局会失效,该函数中用局部的,
    static int y = 30;//使用了static关键字后,该变量只有主函数结束后才会失效
    y++;
    x++;
    printf("in f1(),a=%d,x=%d,y=%d\n",a,x,y); // 10  21  31
}
void f2()
{
    printf("in f2(),x=%d\n",x);
    x = 2000;        //x为全局变量,可以修改,全局变量只有在程序结束后才会失效
}
void f3()
{
    printf("in f3(),x=%d\n",x);
}
int main()
{
    int x = 30,b=100;
    f1(b);                                // 10 21 31
    f1(b);                                // 10 21 32
    printf("in main(),b=%d,x=%d\n",b,x);  // 100 30
    f2();                                 // 1000
    f3();                                 // 2000
    return 0;
}
/*
 * 演示变量生命周期的作用
 * 1 1 2 3 4 8 13 21 .....
 * 0 1 2 3 4 5 6  7 .....
 * */
#include <stdio.h>
// 使用递归函数
// 该方法速度比较慢
int exercise_1(int num) {
    if(num <= 1) {
        return 1;
    }
  return (exercise_1(num - 1) + exercise_1(num - 2));
}
// 使用循环方法
void exercise_2(int num) {
    int a = 1, b = 1, sum = 0, i = 2;
    if(num <= 1) {
        sum = 1;
    }
    else {
        do {
             sum = a + b;
             a = b;
             b = sum;
             i++;
        }while(i <= num);
    }
    printf("%d\n", sum);
}
// 递归方法改进
int exercise_3(int num) {
   static  int arr[50] = {0};//不定义成静态的话,每次执行都相当于重新执行该数组,及前N次执行完后数组还是空的,即下面的程序是无法从该数组中拿到之前计算的结果,速度会很慢。可以加静态变量关键词,可以改为全局变量,可以在主函数中创建数组
    if(num <= 1) {
        return 1;
    }

    if(!arr[num -2]) {
        arr[num - 2] = exercise_3(num -2);
    }

    if(!arr[num - 1]) {
        arr[num - 1 ] = exercise_3(num -1);
    }

    return arr[num -2] + arr[num - 1];
}
int main() {
    int num = 0;
    printf("请输入一个整数:\n");
    scanf("%d", &num);
//   printf("%d\n", exercise_1(num));
   exercise_2(num);
//    printf("%d", exercise_3(num));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘星燎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值