精读《C Primer Plus》——作用域(scope)

作用域(scope)

参考:C Primer Plus 第6版 第12章 存储类别、链接和内存管理

1. 分类

在这里插入图片描述

2. block scope / 块作用域

2.1. 定义

  • block / 块 是用一块花括号括起来的代码区域
  • 块作用域变量的范围是从定义处到包含该定义块的末尾
  • 声明在内层块中的变量,其作用域仅局限于该声明所在的块

2.2. 函数的形式参数

虽然函数的形式参数声明在函数的花括号之前,但是它们也具有块作用域属于函数体这个块。

// 形参 a 和 b 属于 function 函数这个块,
// 作用域仅局限于该函数
void function(int a, int b){ 
    return a+b;
}

2.3. 块中的变量定义

之前,具有块作用域的变量都必须声明在块的开头。C99 标准放开了这个限制:允许在块中的任意位置定义变量。
因此,for 循环语句的代码可以写成如下形式:

// 形参 a 和 b 属于 function 函数这个块,
// 作用域仅局限于该函数
for(int i=0; i<10; i++)
{
    printf("loop 1: n = %d\n", n);
}

2.4. 块作用域的嵌套

#include <stdio.h>

int main()
{
    int n = 8;

    printf("Initially, n = %d at %p\n", n, &n);

    for (int n = 1; n < 3; n++) // loop1
        printf("loop 1: n = %d at %p\n", n, &n);
    
    printf("After loop 1, n = %d at %p\n", n, &n);

    for (int n = 1; n < 3; n++) // loop2
    {
        printf("loop 2 index n: n = %d at %p\n", n, &n);
        int n = 6;
        printf("loop 2: n = %d at %p\n", n, &n);
        n++;
    }

    printf("After loop 2, n = %d at %p\n", n, &n);

    return 0;
}

该程序的输出如下:

Initially, n = 8 at 000000950FDFF6D4
loop 1: n = 1 at 000000950FDFF6F4
loop 1: n = 2 at 000000950FDFF6F4
After loop 1, n = 8 at 000000950FDFF6D4
loop 2 index n: n = 1 at 000000950FDFF714
loop 2: n = 6 at 000000950FDFF734
loop 2 index n: n = 2 at 000000950FDFF714
loop 2: n = 6 at 000000950FDFF734
After loop 2, n = 8 at 000000950FDFF6D4

分析:

  1. 最开始打印的是最早定义的局变量 n;
  2. 进入循环 loop1 之后,隐藏了原有的 n,打印的是 loop1 循环定义的索引 n;
  3. 循环 loop1 退出之后,打印的变量变为局变量 n;
  4. 进入循环 loop2 之后,隐藏了原有的 n,打印的是 loop2 循环定义的索引 n;
  5. 然后在循环体中又声明了一个局变量 n,隐藏了索引 n;
  6. 循环单次迭代结束之后,声明在循环体中的 n 消失,循环头仍调用到索引 n;
  7. 循环 loop1 退出之后,打印的变量重新变为最早定义的局变量 n。

简而言之,索引n的作用域是整个循环,而定义在循环体中变量n的作用域只有单个循环

3. function scope / 函数作用域

  • 仅用于goto语句的标签
  • 即使一个标签首次出现在函数的内层块中,它的作用域也将延伸至整个函数(是整个函数而非块)
  • 标签的函数作用域防止在两个块中使用相同的标签所导致的混乱

4. function prototype scope / 函数原型作用域

参考博客:四种作用域 - CSDN - weixin_45708424(但是这篇博客函数作用域部分的解释与书中不一致,仅参考函数原型作用域这部分)

  • 用于函数原型中的形参名
  • 函数原型作用域的范围是从形参定义处到原型声明结束(可以理解为小括号内)
  • 函数原型声明中的标识符可以与函数定义中说明的标识符名称不同,只要让函数声明和函数定义中小括号内每个变量的类型及数目一致即可,也可以省略掉参数名。
double max(double x, double y);
double max(double num_1, double num_2);
double max(double, double);
// 三者均可

double max(double x, double y){
    if(x<y){
        return y;
    }else{
        return x;
    }
}

5. file scope / 文件作用域

  • 从定义处到该定义所在的文件末尾均可见
  • 文件作用域变量也被称作全局变量 global variable
基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值