首页 > 其他分享 >精读《C Primer Plus》——作用域(scope)

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

时间:2024-09-18 17:50:37浏览次数:11  
标签:精读 函数 作用域 double 变量 scope loop 定义

作用域(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

标签:精读,函数,作用域,double,变量,scope,loop,定义
From: https://blog.csdn.net/joker520522/article/details/142339828

相关文章

  • 使用AgentScope构建多智能体群聊系统
    本文将介绍如何使用AgentScope框架构建一个简单的多智能体群聊系统,并解释其背后的实现逻辑。首先写好设置文件。agent_config.json[{"class":"DialogAgent","args":{"name":"Lingfeng","sys_prompt":"......
  • 面试-JS基础知识-作用域和闭包
    问题this的不同应用场景手写bind函数实际开发中闭包的应用场景,举例说明创建10个<a>标签,点击的时候弹出来对应的序号作用域:某个变量的合法使用范围全局函数块级**自由变量上面图的最里面的红框————aa1a2都是自由变量,因为都没有被定义。会一层一层往上找。......
  • 文心智能体平台、Coze、腾讯元器、ModelScopeGPT和星火大模型的比较,你选哪个?
    平台文心智能体平台(百度)Coze(字节跳动)腾讯元器(腾讯)ModelScopeGPT(阿里云)星火大模型(科大讯飞)背景与开发方百度,中国领先的搜索引擎和AI公司字节跳动,全球知名的互联网科技公司腾讯,中国领先的互联网综合服务提供商阿里云,阿里巴巴集团旗下的云计算服务提供商科大讯飞,中国领先......
  • Python3 学习笔记6-os 模块、错误和异常、面向对象编程、类的专有方法、命名空间和作
    目录一、os模块: 常用方法: 二、错误和异常:(1)语法错误:(2)异常:(3)异常处理:(4)抛出异常:(5)用户自定义异常:(6)清理行为:(7)with语句:三、面向对象编程: (1)类和对象:(2)继承:(3)封装:(4)多态:(5)运算符重载: 四、类的专有方法:(1)__init__(self,...):(2)__del__(self):(3)__repr__(self):(4)__set......
  • 如何将图片转换为向量?(通过DashScope API调用)
    本文介绍如何通过模型服务灵积DashScope将图片转换为向量,并入库至向量检索服务DashVector中进行向量检索。模型服务灵积DashScope,通过灵活、易用的模型API服务,让各种模态模型的能力,都能方便的为AI开发者所用。通过灵积API,开发者不仅可以直接集成大模型的强大能力,也可以对模型进......
  • 通过ModelScope开源Embedding模型将图片转换为向量
    本文介绍如何通过ModelScope魔搭社区中的视觉表征模型将图片转换为向量,并入库至向量检索服务DashVector中进行向量检索。ModelScope魔搭社区旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单。ModelScope魔搭......
  • 面试-JS基础知识-作用域和闭包、this
    函数作为返回值functioncreate(){consta=100returnfunction(){console.log(a)//a在这里是自由变量,向上寻找}}constfn=create()consta=200fn()//100函数作为参数functionprint(fn){consta=13fn()}consta=100functionfn(......
  • 论文精读-U-KAN Makes Strong Backbone for Medical Image Segmentation and Generati
    论文链接:https://arxiv.org/abs/2406.02918 论文代码:https://yes-u-kan.github.io/一、参考文献[1]LiC,LiuX,LiW,etal.U-KANMakesStrongBackboneforMedicalImageSegmentationandGeneration[J].arXivpreprintarXiv:2406.02918,2024.[2]LiuZ,Wan......
  • 构建基于Qwen API 的AgentScope 聊天机器人
    环境搭建与库安装首先,我们需要创建一个Python3.10环境。你可以使用conda来创建一个新的虚拟环境,并激活它:condacreate-npy310python==3.10condaactivatepy310接着,安装所需的库agentscope,由于它可能处于预发布阶段,因此我们需要指定--pre标志:pipinstallagentscope--pre获取......
  • 通过DashScope API调用将多种模态转换为向量
    本文介绍如何通过模型服务灵积DashScope进行多模态向量生成,并入库至向量检索服务DashVector中进行向量检索。模型服务灵积DashScope,通过灵活、易用的模型API服务,让各种模态模型的能力,都能方便的为AI开发者所用。通过灵积API,开发者不仅可以直接集成大模型的强大能力,也可以对模型......