当前位置: 首页 > news >正文

c语言-全局变量与局部变量

目录

1、(作用)域的概念

2、全局与局部的相对性

3、生命周期

3、静态变量static

结语:


前言:

        在c语言中,全局变量的可见范围是整个工程,而局部变量的可见范围从该变量被定义到该作用域结束,在一个变量的可见范围外是调用不了该变量的,换句话说在一个变量的可见范围内不能定义一个和该变量同名的变量,而在该变量的可见范围外可以定义一个与该变量名字一样的变量。

        全局变量的生命周期是整个程序的生命周期,而局部变量的生命周期是从该变量在他的作用域中被定义开始,直到出了该作用域就结束,结束意味着该局部变量以及他的值会被系统销毁。

1、(作用)域的概念

        首先再了解全局变量和局部变量前,最重要的是了解什么是作用域,通常用一对大括号”{}“括起来的区域就是一个作用域,而在该作用域创建的变量为局部变量,重要的是作用域与作用域之间是互不干扰的,是相对独立的两块区域。

        比如最常见的main函数就是用一个大括号括起来的:

#include<stdio.h>int main()
{//左大括号//main函数的作用域//...int a = 12;//a为局部变量return 0;
}//右大括号

        不仅仅只有函数是用大括号进行规划的,if语句和while循环、fot循环等等都是用大括号”{}“进行规划作用域的,因此在这些大括号中创建的变量也可以称为局部变量,且相互独立。

        例子如下:

#include<stdio.h>int main()
{int a = 12;if (1){int a = 20;}for (int a = 1; a > 0; a--){}while (a--){int a = 100;}printf("hello world");return 0;
}

        以上代码虽然在同一个main函数内定义了4个a变量,但是是在不同的作用域中都有的,因此最后可以正常打印出了hello world,说明该程序没有问题。


        函数区分作用域的例子如下:

#include<stdio.h>void func()
{int a = 20;
}int main()
{int a = 12;func();printf("hello world");return 0;
}

        最后依旧能够打印出hello world,表示该程序没有问题。

2、全局与局部的相对性

        全局变量和局部变量是具有相对性的,比如一个局部变量a,他相对于他作用域外是局部的,但是他相对于他的作用域里面的某个作用域是全局的。

        示例代码如下:

#include<stdio.h>int main()
{int a = 12;//相对于if语句里的作用域,该a是全局变量if (1){printf("%d ", a);//可以打印出a的值}return 0;
}

        运行结果:


         若一个作用域和该域之外的作用域都有一个同名变量a,若想在该作用域中打印该变量的值,则打印的是局部变量的值,遵循局部优先的法则。

         示例代码如下:

#include<stdio.h>int a = 1020;//全局变量int main()
{printf("%d\n", a);//由于局部变量的可见范围是在其创建时才开始,因此这里打印的是1020int a = 12;//局部优先printf("%d\n", a);if (1){printf("%d\n", a);//由于局部变量的可见范围是在其创建时才开始,因此这里打印的是12int a = 20;//局部优先printf("%d\n", a);}return 0;
}

        运行结果:

3、生命周期

        一个变量出了其作用域就会被销毁,表示其生命周期结束了,生命周期通常是用函数中的局部变量来做解释,因为一个函数被调用完成后会被销毁,其函数中的局部变量也就跟着销毁了。

        示例代码如下:

#include<stdio.h>void func()
{int a = 2;//出了函数,变量a就被销毁
}int main()
{func();printf("%d ", a);//此处会找不到变量aif (1){int a = 12;//出了作用域,也可以理解为变量a被销毁}printf("%d ", a);//此处也会找不到变量areturn 0;
}

3、静态变量static

        static的作用是延长局部变量的生命周期,但是不会延长其可见范围,也就是某个作用域中的变量加了static后,下一次来到该作用域时,该变量不会再次被初始化,而是接着用之前的值,但是在该变量作用域外的作用域依然无法调用他。

        示例代码如下:

#include<stdio.h>void func()
{static int a = 2;//只会初始化一次a,后续就跳过初始化的步骤a++;printf("%d ", a);
}int main()
{func();func();func();//printf("%d ", a);//此处依然找不到areturn 0;
}

        运行结果:

        没加static的运行结果: 

        从结果可以看到,如果没有加static,那么局部变量a在调用完函数func后就跟着销毁了,则下一次调用函数func时,a又会重新初始化。如果加了static,a只会初始化一次,并且不会跟着函数一起销毁,后续调用函数func时,a会保留之前的值进入该函数。

结语:

        全局变量和局部变量作为c语言中的基础,其虽然看起来不起眼,但是对今后的学习都是非常重要的一环知识,最后希望本文可以给你带来更多的收获,如果本文对你起到了帮助,希望可以动动小指头帮忙点赞👍+关注😎+收藏👌!如果有遗漏或者有误的地方欢迎大家在评论区补充~!!谢谢大家!!( ̄︶ ̄)↗

http://www.lryc.cn/news/262109.html

相关文章:

  • 【Spring】00 入门指南
  • BIM 技术:CIM (City Information Modeling) 1-7 级
  • c++ websocket 协议分析与实现
  • kali虚拟机无网络
  • Unity2023.3(Unity6)版本开始将可以发布WebGPU
  • 计算机网络期末考试A卷及答案
  • <蓝桥杯软件赛>零基础备赛20周--第10周--二分
  • C++友元类,工厂模式和继承的融合案例
  • 使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值
  • Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
  • Python Django Suit:构建现代化的Django后台管理
  • 电子学会C/C++编程等级考试2021年09月(六级)真题解析
  • SpringBoot 源码解析
  • dockerfile---创建镜像
  • Raspberry PI + Codesys + EtherCAT步进驱动ECR60 Motion功能测试
  • 03 Temporal 详细介绍
  • 【算法】【动规】乘积为正数的最长子数组长度
  • Kubernetes实战(十四)-k8s高可用集群扩容master节点
  • Spring之容器:IOC(1)
  • 【.Net 6.0--通用帮助类--ConvertHelper】
  • 【加解密】报文签名与加解密,MD5,RSA,AES使用案例(基于 Java)
  • 新建vue3项目
  • 出现 Error:Unable to access jarfile xxxx\target\nacos-server.jar 解决方法
  • 记录一次API报文替换点滴
  • PMP项目管理 - 沟通管理
  • fckeditor编辑器改造示例:增加PRE,CODE控件
  • 风速预测(五)基于Pytorch的EMD-CNN-LSTM模型
  • 单元测试二(理论)-云计算2023.12-云南农业大学
  • QModelIndex 是 Qt 框架中的一个类,用于表示数据模型中的索引位置
  • 前端实现一个时间区间内,再次单选功能,使用Antd组件库内日历组件Calendar