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

这篇具有很好参考价值的文章主要介绍了scope / 作用域(C变量的作用域)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

目录
  • scope / 作用域(C变量的作用域)
    • 1. 定义
    • 2. 分类
      • 2.1. block scope / 块作用域
        • 2.1.1. 定义
        • 2.1.2. 函数的形式参数
        • 2.1.3. 没有花括号的块
      • 2.2. function scope / 函数作用域
      • 2.3. function prototype scope / 函数原型作用域
      • 2.4. file scope / 文件作用域
    • 3. 总结

1. 定义

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

2. 分类

scope可以分为四类:
scope / 作用域(C变量的作用域)

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:文章来源地址https://www.toymoban.com/news/detail-825020.html

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

到了这里,关于scope / 作用域(C变量的作用域)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Bean 的作用域(Bean Scope)

    大家好,我是 god23bin,今天我们来聊一聊 Spring 框架中的 Bean 作用域(Scope)。 我们在以 XML 作为配置元数据的情况下,进行 Bean 的定义,是这样的: 我们写了一个 Bean 定义(Bean Definition),就是用于创建所定义的类的实例的。 一个 Bean 定义,我们可以类比一个类的定义,你

    2024年02月09日
    浏览(40)
  • 基于Xml方式的Bean的配置-Bean的作用范围scope配置

    Bean的配置范围 默认情况下( 基本的Spring环境 ),单纯Spring环境Bean的作用范围有两个:Singleton和prototype singleton :单例,默认值, Spring容器创建的时候,就会进行Bean的实例化 ,并储存到Bean的内部的 单例池 中,每次getBean时都是从单例池中获取相同的Bean实例 prototype :原型,

    2024年02月07日
    浏览(52)
  • C++ Primer 5th 阅读笔记:变量和基本类型

    内建类型 ,如整型,字符型等; 变量 ,为值绑定的一个名字; 表达式和语句 ,操作值。 分支和循环 ,允许我们条件执行和重复执行; 函数 ,定义抽象计算单元。 自定义类型; 标准库。 学习语言的基本知识和标准库。 内建类型; 简要介绍自定义类。 定义了数据的意义

    2024年02月02日
    浏览(51)
  • 【vue2第九章】组件化开发和根组件以及style上的scoped作用

    组件化开发和根组件 什么是组件化开发? 一个页面可以拆分为多个组件,每个组件有自己的 样式,结构,行为 ,组件化开发的好处就是,便于维护,利于重复利用,提升开发的效率。 便于维护 :页面中块出了问题,可以直接去找到这个组件,修改组件的样式逻辑结构。

    2024年02月10日
    浏览(48)
  • Vue在表格中拿到该行信息的方式(作用域插槽-#default-scope-解决按钮与行点击的顺序问题)

    在做表格的时候,表格是封装好了的,用于展示数据。如果想给单行增加按钮,可以单独写一列存放按钮,最基本的需求是,点击按钮后要拿到数据然后发起请求。 且Vue的element-plus,当我们点击按钮之后会自动触发行点击事件。这本身是一件好的事情,但难搞的地方在于,执

    2024年02月10日
    浏览(47)
  • C++的作用域、变量作用域、生命周期和变量分类介绍

    C++ 中的作用域(scope)指的是变量、函数或其他标识符的可见和可访问的范围。 变量作用域(Variable Scope)是指变量的生命周期和可见性,也就是变量在程序中的哪些部分可以使用。按照作用域(Scope)变量可分类为全局变量和局部变量。 还可按照生命周期(Lifetime)进行分

    2024年02月13日
    浏览(43)
  • 【C语言趣味教学】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(32)
  • 【C语言趣味教程】(6) 作用域:局部变量 | 全局变量 | 局部变量优先原则 | 利用大括号限制作用域 | 变量的生命周期

        🔗 【C语言趣味教程】专栏介绍👈 猛戳了解!!! 0x00 引入:什么是作用域? 变量和常量在程序中都是有作用范围的,这个范围我们称之为变量的  作用域 (scope) 。 作用域也称为 \\\"定义域\\\",是程序中 定义的变量所存在的区域,出了该区域变量就不能被访问。 变量的作

    2024年02月14日
    浏览(49)
  • 面向对象【成员变量与局部变量、方法声明与作用】

    Java中的成员变量是指 类中声明的变量 ,也称为实例变量或属性。它们与方法一样属于类的成员,不同之处在于,它们存储在对象(堆)中而不是栈中,并且每个对象都有自己的一组值。 成员变量可以用来描述一个对象的状态,例如人的年龄、学生的姓名等。它们可以具有pub

    2024年02月10日
    浏览(59)
  • MySQL 5.7服务器系统变量参考

     官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.4 Server System Variable Reference 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. MySQL 5.7 参考手册  /  ...  /  服务器系统变量参考 5.1.4 服务器系统变量参考 下表列出了 中适用的所有系统变量  mysqld 。 该表在

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包