C语言---作用域

文章目录

  • [1. 块级作用域 (Block Scope)](#1. 块级作用域 (Block Scope))
  • [2. 文件作用域 (File Scope)](#2. 文件作用域 (File Scope))
  • [3. 函数作用域 (Function Scope)](#3. 函数作用域 (Function Scope))
  • [4. 函数原型作用域 (Function Prototype Scope)](#4. 函数原型作用域 (Function Prototype Scope))
  • 核心规则:作用域遮蔽 (Scope Shadowing)

在C语言中,作用域(Scope)指的是程序中变量、函数等标识符可见并可被访问的区域。

1. 块级作用域 (Block Scope)

块级作用域是指在大括号 {} 之间定义的变量。

范围:从变量声明处开始,到包含该声明的最近的右大括号 } 结束。

典型场景:函数体内部、if 语句块、for 循环块等。

特点:这些变量通常被称为"局部变量"。当程序执行离开该代码块时,这些变量通常会被销毁。

bash 复制代码
void func() {
    int x = 10; // 块级作用域开始
    if (x > 0) {
        int y = 20; // y 的作用域仅在 if 块内
        printf("%d", x + y);
    }
    // printf("%d", y); // 错误:y 在此处不可见
} // x 的作用域结束

2. 文件作用域 (File Scope)

在所有函数外部定义的标识符具有文件作用域。

范围:从声明点开始,直到整个源文件结束。

典型场景:全局变量、函数定义。

特点:这些变量在整个文件内的任何函数中都可以访问。如果使用 static 关键字,该变量将仅限于当前文件;如果不加 static,可以通过 extern 关键字在其他文件中访问。

bash 复制代码
int global_var = 100; // 文件作用域

void test() {
    global_var = 200; // 可以访问
}

3. 函数作用域 (Function Scope)

函数作用域是C语言中最特殊的一种,它仅适用于标签(Label),即用于 goto 语句的标识符。

范围:标签在定义它的整个函数内都是可见的,无论它嵌套在多少层大括号内。

注意:普通的变量不具备这种作用域。

bash 复制代码
void func() {
    {
        goto end; // 即使 end 在后面且在不同块中也能跳转
    }
end:
    printf("Finished");
}

4. 函数原型作用域 (Function Prototype Scope)

这是一种极短的作用域,仅存在于函数声明(原型)的括号内。

范围:仅限于函数声明的参数列表。

特点:在函数原型中,参数名其实是可选的,其主要目的是为了文档化或配合变长数组(VLA)。

c 复制代码
// 此处的 width 和 height 仅在声明的括号内有效
void set_matrix(int width, int height, int matrix[width][height]);

核心规则:作用域遮蔽 (Scope Shadowing)

很多的教学资料习惯将其称为将近原则。

当内部作用域声明了一个与外部作用域同名的标识符时,内部的标识符会"遮蔽"外部的标识符。在内部作用域中,访问该名称将指向内部定义的实体。

bash 复制代码
int x = 10; // 全局 x

int main() {
    int x = 20; // 局部 x 遮蔽了全局 x
    {
        int x = 30; // 更深层的 x 遮蔽了上面的局部 x
        printf("%d\n", x); // 输出 30
    }
    printf("%d\n", x); // 输出 20
    return 0;
}
相关推荐
Eloudy1 小时前
全文 - version.A - AMBA CHI Chip-to-Chip(C2C)
java·开发语言·数据库·gpu·chiplet
秋名RG1 小时前
Java历代LTS版本新特性详解(代码增强版)
java·开发语言·python
李少兄1 小时前
深度剖析 Hutool ObjectUtil
java·开发语言
魏码不凡1 小时前
Go 编译报错:undefined: webp.Encode 问题排查与解决
开发语言·后端·golang
27669582922 小时前
youdao/有道翻译APP 算法协议分析
开发语言·前端·python·sign·youdao·有道翻译app算法·有道app协议请求
励志不掉头发的内向程序员2 小时前
【从零写一个CAD 04】中键拖动平移:抓住一个点,让它一直待在鼠标底下
开发语言·c++·qt·学习·系统架构·计算机外设
tachibana23 小时前
与其他语言相比,使用 Go 有什么好处?
开发语言·后端·golang·go
Logic1014 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
阿俊-全栈开发7 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
Logic10110 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质