16-C语言中的作用域——函数声明,函数头,局部与全局作用域以及作用域的掩盖

2024-06-11 11:04

本文主要是介绍16-C语言中的作用域——函数声明,函数头,局部与全局作用域以及作用域的掩盖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

16-C语言中的作用域——函数声明,函数头,局部与全局作用域以及作用域的掩盖

文章目录

  • 16-C语言中的作用域——函数声明,函数头,局部与全局作用域以及作用域的掩盖
    • 一、函数声明的作用域
    • 二、函数头中的作用域
    • 三、局部作用域
    • 四、全局作用域
    • 五、作用域的临时掩盖
    • 六、`static` 关键字

概念:C语言中所有的标识符(变量/函数名)都有可见范围,即作用域。为了避免同名冲突,应该尽可能缩小标识符的可见范围。

一、函数声明的作用域

概念
函数声明通常写在头文件内部,或者源文件的头部,用来告诉编译器函数的模型。

示例

// main.c// 函数声明
bool swap(int *, int *);
int max(int a, int b, int c);

作用域:函数声明的作用域只是当前文件可见,虽然写在函数体外,但并不是全局的。

二、函数头中的作用域

概念
函数头声明了函数的原型及参数列表。

示例

int max(int a, int b, int c) { // 函数头// 函数体
}

作用域

  • max 默认是全局可见的,除非被 static 修饰则本文件可见。
  • 参数 a, b, c 是该函数的局部变量,作用域在函数体内部。

三、局部作用域

概念
在代码块内定义的变量,可见范围从定义语句开始直到该代码块的右括号结束 }

示例

{int b = 250;{int c = 399; // c 作用域开始int d = 249;} // c 作用域的结束printf("c:%d\n", c); // 已经离开了c的作用域因此不能使用
}

注意
代码块指的是一对 {} 括起来的区域。代码块可互相嵌套,外层的标识符可以被内层识别,反之则不行。在内层代码块中定义的标识符,在外层代码块中是不可见的。

四、全局作用域

概念
在代码块的外部定义,变量的可见范围可以跨文件可见。

示例

int global; // 变量 global 是跨文件可见的全局变量int main(int argc, char const *argv[]) {int a = 1;int b = 250;
}

注意
全局变量定义在函数体外部。如果被 static 修饰,则只在本文件中可见(可见范围被缩小)。

五、作用域的临时掩盖

概念
如果有多个不同的作用域互相嵌套,小的作用域的作用范围会临时掩盖大的作用域(标识符名字相同),临时失去大作用域的值。

示例:

int a = 1;{printf("1a:%d\n", a); // 输出为 1,使用的是外面大的作用域int a = 250; // 从这里开始 a 的值被临时覆盖为 250,外面的 a 临时失效printf("2a:%d\n", a); // 输出为 250,使用的是内部的小的作用域
}printf("3a:%d\n", a); // 离开小的作用域后,a 恢复为 1

六、static 关键字

概念
在C语言中非常重要的一个关键字,它在不同的场合表现的意义不一样。

  1. 缩小可见范围为本文件可见:

    • 修饰全局变量。
    • 修饰普通的函数。
  2. 修改变量的存储区为静态数据(数据段):

    • 修饰局部变量,使局部变量的存储区从栈改为数据段。

示例

// 修饰全局变量
static int global_var;// 修饰普通函数
static void my_function() {// 函数体
}// 修饰局部变量
void example_function() {static int local_static_var = 0; // 局部静态变量
}

这篇关于16-C语言中的作用域——函数声明,函数头,局部与全局作用域以及作用域的掩盖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050981

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function