首页 > 其他分享 >复习课6 变量的作用域与生命周期

复习课6 变量的作用域与生命周期

时间:2023-09-17 15:32:17浏览次数:55  
标签:生命周期 复习 作用域 void int printf test main

一.导入

我们之前讲了局部变量与全局变量的区别,而作用域其实变量在程序的哪一段代码中能起到作用,哪里不能起到作用的一个概念,所以我们在讲作用域的时候很大一部分都是与上一篇文章相关的,所以如果没有看过上一篇文章建议先回看,那我们正式开始!

二.作用域(局部变量)

我们先来看一段简单的代码:

#include<stdio.h>
int main(void){
    {
        int a = 10;
        printf("a=%d\n",a);
    }
    return 0;
}

这段代码输出的结果显然是10,因为变量a的值为10而printf()输出的正是a的值,那么我们再来看下面这段代码:

#include<stdio.h>
int main(void){
    {
        int a = 10;
        printf("a=%d\n", a);
    }
    printf("a=%d\n",a);
    return 0;
}

这次我们讲一个printf()放在括号的外面,当我们尝试编译运行该程序的时候就会收到编译器抛出的错误,如图所示:

复习课6 变量的作用域与生命周期_作用域

编译器告诉我们找不到a这个变量,可能我们会感到疑惑,上面明明定义了并初始化了变量 a 为什么编译器会告诉我们找不到这个变量呢?其实这就是局部变量的作用域导致的,我们的变量a是初始化在这段大括号内部的,所以他的作用域就仅限于大括号内使用,所以我们可以总结出以下结论:

局部变量的作用域是变量所在的局部范围内

那我们如果再讲代码改成如下形式程序还能正常运行吗?

#include<stdio.h>
int main(void){
    int a = 10;
    {
        printf("a=%d\n", a);
    }
    printf("a=%d\n",a);
    return 0;
}

我们运行后可以发现程序可以正常的编译与运行,如图所示:

复习课6 变量的作用域与生命周期_局部变量_02

因为这时候变量a的作用域就是整个main()函数内部而这两个printf()函数都在main()函数的内部所以程序当然是可以正常运行的

三.作用域(全局变量)

说完局部变量我们来看一下全局变量的作用域又是什么呢?我们照例使用代码的形式来进行讲解

#include<stdio.h>
int a = 10;
int main(void){
    {
        printf("a=%d\n", a);
    }
    printf("a=%d\n",a);
    return 0;
}

我们讲变量a写在main()函数的外部这时候我们编译并运行程序可以发现程序可以正常运行,那如果在main()函数中写一个自定义的函数test(),我们在test()中又是否能输出a的值呢?以下是示例代码:

#include<stdio.h>
int a = 10;
void test(void)
{
    printf("test a = %d\n",a);
}
int main(void){
    test();
    {
        printf("a=%d\n", a);
    }
    printf("a=%d\n",a);
    return 0;
}

我们编译并运行代码后可以发现程序可以正常的输出main()函数与test()函数中的内容,如图所示:

复习课6 变量的作用域与生命周期_作用域_03

那么我们可以讲变量a称为全局变量,全局变量的特点是在整个代码的任意地方都可以直接调用,甚至我们可以在整个工程中直接调用,如我们现在有一个工程,里面包含了code.c 与 test.c 两个源文件,我们在code.c中写入以下代码:

#include<stdio.h>
void test(void)
{
    printf("test a = %d\n",a);
}
int main(void){
    test();
    {
        printf("a=%d\n", a);
    }
    printf("a=%d\n",a);
    return 0;
}

在test.c中输入以下代码:

int a = 10;

这时候我们直接编译是会报错的,所以我们需要在code.c的第一行写入:

extern int a;

这里的extern是用来声明外部符号的一个C语言关键字

我们对上述代码进行编译运行可以发现结果与上一个代码结果是一样的,如图所示:

复习课6 变量的作用域与生命周期_全局变量_04

综上所述:全局变量的作用域是整个工程

四.变量的生命周期

每一个事物都有自己的生命周期,变量亦是如此,我们拿上面这段代码举例:

#include<stdio.h>
int main(void){
    {
        int a = 10;
        printf("a=%d\n", a);
    }
    printf("a=%d\n",a);
    return 0;
}

括号内的变量a被初始化的时候意味着变量生命周期的开始,当括号结束的时候就代表着变量生命周期的结束,这个变量也会被自动销毁,严谨来说:局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束

那么全局变量的作用域是整个工程,也就说当程序开始时全局变量生命周期开始,当程序结束时全局变量的生命周期结束,也就说:全局变量的生命周期是整个程序的生命周期

标签:生命周期,复习,作用域,void,int,printf,test,main
From: https://blog.51cto.com/u_16183773/7502305

相关文章

  • 复习C语言-题目 1008: [编程入门]成绩评定
    题目描述给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以及90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。输入格式一个整数0-100以内输出格式一个字符,表示成绩等级样例输入复制90样例输出复制A1#inclu......
  • 复习C语言-题目 1009: [编程入门]数字的处理与判断
    题目描述给出一个不多于5位的整数,要求1、求出它是几位数2、分别输出每一位数字3、按逆序输出各位数字,例如原数为321,应输出123输入格式一个不大于5位的数字输出格式三行第一行位数第二行用空格分开的每个数字,注意最后一个数字后没有空格第三行按逆序输出......
  • Linux与Shell编程期末复习
    Linux中各类特殊变量的含义$#是传给脚本的参数个数$0是脚本本身的名字$1是传递给该shell脚本的第一个参数$2是传递给该shell脚本的第二个参数$@是传给脚本的所有参数的列表$*是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个$$是脚本运行的当前......
  • springbean生命周期
    B站连接https://www.bilibili.com/video/BV12a411r75X/?spm_id_from=333.337.search-card.all.click&vd_source=f0f7ef36d638628b3ab7a240c872017dSpringBean的生命周期大致上分为五个阶段:创建前准备:Bean在开始加载之前要从上下文和一些配置中去解析并且查找Bean有关扩展的实现,......
  • vue--day88--缓存路由组件和 两个新的生命周期钩子
    ###10.缓存路由组件 1.作用:让不展示的路由组件保持挂载,不被销毁。 2.具体编码:   ```vue  <keep-aliveinclude="News">     <router-view></router-view>  </keep-alive>  ``` ###11.两个新的生命周期钩子 1.作用:路由组件所独有的两......
  • 复习课5 遍写一个简单的求和程序
    一.导入上节课我们介绍了变量、常量、局部变量、全局变量的特性,接下来就让我们来编写一个简单的求和程序二.程序要求,程序需要有三个整型变量:num1num2sum,最后的求出的和保存在变量sum中,最后输出sum的值给用户(注:num1与num2数值自定)三.分析程序我们看题目就可以知道我们需要先创建......
  • 随缘复习初赛
    常识&参考资料初赛史上最全NOIP初赛知识点【全】CSP初赛通过指南CSP-J/S初赛知识点整理CSP-J/S初赛复习(1)-计算机基本常识、进制与编码!CSP初赛知识点考前整理CSP初赛知识点梳理二进制\(n\)进制转\(10\)进制,第\(i\)位的值乘上其位权\(2^{n-1}\)\(10\)进制转......
  • Python并发编程——IO模型、阻塞IO、非阻塞IO、多路复用、异步IO、IO模型比较、select
    文章目录每日测验一IO模型介绍二阻塞IO(blockingIO)三非阻塞IO(non-blockingIO)四多路复用IO(IOmultiplexing)五异步IO(AsynchronousI/O)六IO模型比较分析七selectors模块网络并发知识点梳理网络并发知识点梳理每日测验简述死锁现象你用过哪些队列阐述进......
  • 软件测试|全面解析Docker Start/Stop/Restart命令:管理容器生命周期的必备工具
    简介Docker是一种流行的容器化平台,用于构建、分发和运行应用程序。在使用Docker时,经常需要管理容器的生命周期,包括启动、停止和重启容器。本文将详细介绍Docker中的dockerstart、dockerstop和dockerrestart命令,帮助您全面了解如何管理容器的运行状态。在Docker中,容器是独立......
  • 各种模板复习及记忆口诀(持续更新)
    模板大复习目录模板大复习字符串:manacher找回文重点:kmp找broader图论相关:温馨提示:注意看好边是有向还是无向!floyd全源最短路djkstra最短路:SPFA最短路点双:边双:差分约束:二分图最大匹配/最小覆盖。最大流(dinic)树型结构:线段树:树状数组:平衡树(非旋treap)笛卡尔树(感觉考的少)主席树(感觉考......