首页 > 其他分享 >scope / 作用域(C变量的作用域)

scope / 作用域(C变量的作用域)

时间:2024-01-31 21:35:18浏览次数:29  
标签:定义 作用域 函数 scope 2.1 loop 变量

scope / 作用域(C变量的作用域)

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

目录

1. 定义

描述程序中可以访问identifier(标识符)的区域

2. 分类

scope可以分为四类:

2.1. block scope / 块作用域

2.1.1. 定义

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

2.1.2. 函数的形式参数

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

2.1.3. 没有花括号的块

之前,具有块作用域的变量都必须声明在块的开头,C99标准放开了这个限制:作为循环或者if语句的一部分,即便不使用花括号,也是一个块。

所以for循环语句可以这样定义:for(int i=0; i<10; i++)

更完整地说,整个循环是它所在块的子块,循环体是整个循环块的子块;if语句是一个块,与其相关联的子语句是if语句的子块,这其中包含着一种嵌套关系。

#include <stdio.h>

int main()
{
    int n = 8;

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

    for (int n = 1; n < 3; n++)
        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++)
    {
        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

进入循环之后,隐藏了原有的n;
然后在循环体中又声明了一个n,隐藏了索引n;
循环单次迭代结束之后,声明在循环体中的n消失,循环头仍调用到索引n;
当整个循环完成之后,原始的n重新起作用。

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

!!!没必要在程序中使用相同的变量名

2.2. function scope / 函数作用域

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

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

参考:CSDN博客,但是它函数作用域写错了

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

2.4. file scope / 文件作用域

  • 从定义处到该定义所在的文件末尾均可见
  • 文件作用域变量也被称作全局变量 global variable

3. 总结

  1. scope的定义
  2. scope的分类以及各自的含义

Others:

  1. goto标签如何使用?
  2. 什么是函数原型?

标签:定义,作用域,函数,scope,2.1,loop,变量
From: https://www.cnblogs.com/HoNorthNorth/p/18000157

相关文章

  • 11.jmeter用户定义变量、请求头管理器、json提取器、CSV导入数据
     ......
  • eXeScope 注册机制算法破解
    使用x64dbg进行修改从网上找来一片文章,感觉靠谱,如下---------------------------------------------------------------------------------------第一次看到这个界面还是在十多年前,当时的我并不明白这些数据的含义。现在为它写一篇博客,算是一种纪念吧。用x64dbg加载exescop......
  • vue3 在 TypeScript 文件中,const route = useRoute();route undefined 不能在顶层作用
    ts文件内部不能使用import{useRoute}from'vue-router';constroute=useRoute();routeundefined在TypeScript文件中,不能在顶层作用域内使用Vue组件的Hooks函数,例如useRoute。Hooks函数只能在Vue组件中使用。如果你想在TypeScript文件中获取当前路由信息,你可......
  • Golang学习(三)基本语法[变量、常量、类型、类型转换]
    变量声明Go语言中有四类标记:标识符(identifiers)、关键字(keywords)、运算符(operators)标点符号(punctuation)以及字面量(literals)。Go语言变量标识符由字母、数字、下画线组成,其中首字符不能为数字,同一字母的大小写在Go语言中代表不同标识。在Go语言中,命名标识符时,通常选择英文的52个大......
  • SQL变量数据加工在Java规则引擎中的应用案例分析
    SQL变量加工SQL加工背景,在决策配置过程中,一些复杂的逻辑或模型可通过自定义SQL脚本编写创建数据变量,通过SQL脚本可以便捷的从数据库中取数,并且自定义SQL支持传参,可满足更复杂多变的数据加工处理。注意,SQL变量加工和算子编排加工的方式不同,SQL变量加工依赖于对应数据源的服务器的性......
  • Linux环境变量配置文件
    1.什么是环境变量配置文件环境变量-配置文件环境变量是可以在父shell和子shell都生效的变量,Linux允许把本地变量声明为环境变量,但是不会永久生效,一旦重启,就会失效想要永久生效,需要把这个更改放进环境变量配置文件环境变量配置文件中主要是定义对系统的操作环境生效......
  • WebAssembly入门笔记[4]:利用Global传递全局变量
    利用WebAssembly的导入导出功能可以灵活地实现宿主JavaScript程序与加载的单个wasm模块之间的交互,那么如何在宿主程序与多个wasm之间传递和共享数据呢?这就需要使用到Global这个重要的对象了。一、数值类型全局变量二、将JavaScript函数设置为全局变量三、利用全局变量处理字符......
  • MySQL 系统变量 group_replication_get_communication_protocol
    MySQL系统变量group_replication_get_communication_protocol(MonJan2923:14:512024)[root@GreatSQL][(none)]>selectversion(),group_replication_get_communication_protocol();+-----------+------------------------------------------------+|version()|gr......
  • Python Seaborn 衍生变量的可视化
    ​ Seaborn是一个基于matplotlib的Python库,用于创建统计图形。衍生变量是指从原始数据中计算得出的新变量。使用Seaborn可视化衍生变量,通过绘制衍生变量的图表,可以更好地理解数据之间的关系,发现数据中的潜在模式,识别异常值。1、创建衍生变量对衍生变量进行可视化是一......
  • Maven学习之路--依赖范围scope 对于该包的依赖范围作用域,取值有:test、compile、provid
    Maven学习之路--依赖范围scope对于该包的依赖范围作用域,取值有:test、compile、provided、runtime。scope默认取值为compile。\   <scope></scope>表示对于该包的依赖范围作用域,取值有:test、compile、provided、runtime。scope默认取值为compile。<scope>test</scope>。te......