看表情包学C语言 ——局部优先原则

🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!!


Ⅰ. 作用域(Scope)

0x00 引入:什么是作用域?

变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的 作用域(scope) 。

作用域也称为 "定义域",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。

变量的作用域又可以分为全局作用域局部作用域

0x01 局部变量

在函数内部声明或定义的变量称为 局部变量 (local variable) 。

局部变量的作用域仅在该函数的内部(在大括号内部),出了函数(大括号外)就无效:

cpp 复制代码
#include <stdio.h>

int main(void)
{
    int a = 20;   // 局部变量

    return 0;
}

0x02 全局变量

在函数内部声明或定义的变量称之为 全局变量 (global variable) 。

全局变量的作用域在整个工程,全局变量定义在函数外,我们通常将其定义在程序的顶部:

cpp 复制代码
#include <stdio.h>

int global_A = 10;       // 全局变量

int main(void)
{
    printf("Hello,World!\n");

    return 0;
}

这样,我们就定义了全局变量 global_A,它的生命周期是整个程序的生命周期。

我们可以在任意的函数内部访问到这个 global_A,因为它具有全局性。

因此,全局变量在声明后可作用于整个程序。

❓ 如何快速分辨全局变量和局部变量?最简单的方法就是看大括号!

  • 大括号外部定义的变量叫做 全局变量
  • 大括号内部定义的变量叫做 局部变量

0x02 局部变量优先原则

当局部变量和全局变量的名字相同时,局部变量优先。

**💬 代码演示:**局部变量优先

cpp 复制代码
#include <stdio.h>

int var = 100;     // 全局变量

int main(void)
{
    int var = 10;  // 局部变量
    printf("%d\n", var);

    return 0;
}

🚩 运行结果如下:

0x03 利用大括号限制变量作用域

使用大括号可以限制一个变量的作用域,在大括号内的变量就是局部变量。

其作用范围仅仅在这个打括号内,出了这个大括号就无效。

**💬 代码演示:**使用大括号限制变量的作用域

cpp 复制代码
#include <stdio.h>

int main(void)
{
    int a = 0;
    {
        int a = 10;
        printf("大括号内 a 的值:%d\n", a);
    }
    printf("大括号外 a 的值:%d\n", a);

    return 0;
}

🚩 运行结果如下:

这里仍然遵循局部变量优先原则,局部变量优先。

Ⅱ. 声明周期(Life Cycle)

0x00 引入:生命周期的概念

变量创建和销毁之间的时间段,称为 生命周期 (Life Cycle)。

全局变量的生命周期和局部变量的生命周期是不同的:

  • 全局变量:整个程序的生命周期。
  • 局部变量:进入作用于生命周期开始,出了作用域生命周期结束。

0x01 局部变量的生命周期

局部变量的生命周期简单来说,就是出了 "大括号" 就失效。

**💬 代码演示:**局部变量的生命周期

cpp 复制代码
#include <stdio.h>

int main(void)
{
    {
        int a = 10;
        printf("%d\n", a);
    }   

    printf("%d\n", a);  // 出了作用域了
}

🚩 运行结果:(报错)

0x02 全局变量的生命周期

而全局变量则不同,全局变量生命周期是整个程序,因此不用担心出了大括号用不了该变量。

我么可以在任意的函数内部能访问全局变量,当然,还是要遵循局部变量优先原则。

如果有同名的局部变量,还是会优先选定局部变量的:

cpp 复制代码
#include <stdio.h>

int A = 10;       // 全局变量

int main(void)
{
    printf("%d", A);   // 访问全局变量A

    return 0;
}

**🚩 运行结果:**10

cpp 复制代码
📌 [ 笔者 ]   王亦优 | 雷向明
📃 [ 更新 ]   2023.7.31
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 📜 参考文献: - C++referenceEB/OL. \[\]. http://www.cplusplus.com/reference/. - Microsoft. MSDN(Microsoft Developer Network)EB/OL. \[\]. . - 百度百科EB/OL. \[\]. https://baike.baidu.com/. - 维基百科EB/OL. \[\]. https://zh.wikipedia.org/wiki/Wikipedia - R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015. - B. 比特科技. C/C++EB/OL. 20212021.8.31 - 林锐博士. 《高质量C/C++编程指南》M. 1.0. 电子工业, 2001.7.24. - 陈正冲. 《C语言深度解剖》M. 第三版. 北京航空航天大学出版社, 2019. - 侯捷. 《STL源码剖析》M. 华中科技大学出版社, 2002. - T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。 - T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018. - J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005. - R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011 - S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。 - S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。 - E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993 - S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008. - A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974. - M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997. - A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. - E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997. - R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998 - R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002 |

相关推荐
花生了什么事o9 分钟前
synchronized 与 ReentrantLock:Java 锁机制原理与实现对比
java·开发语言
aramae21 分钟前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端
ZHOU_WUYI24 分钟前
4. light wam 模型loss计算过程
开发语言·人工智能·python
长不胖的路人甲1 小时前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
haolin123.2 小时前
类和对象(上)
开发语言·c++
麻瓜老宋2 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十四步,结束开发,生成calc 用法指南
c语言·开发语言·atomcode
霸道流氓气质3 小时前
分布式系统中接口时序不确定性处理
java·开发语言·分布式
库克克3 小时前
【C++】C++11 包装器function 与 绑定器 bind
开发语言·c++
0x3F(小茶)3 小时前
STM32 SPI的5种方向模式
c语言·stm32·单片机·嵌入式硬件
多加点辣也没关系3 小时前
JavaScript|第30章:事件机制
开发语言·javascript