C 中变量的作用域与生命周期

2024-01-11

有人可以准确解释 C 中变量的范围和生命周期的概念吗?在 C++ 中是否有所不同?我对范围和生活感到困惑。


变量的“范围”是源代码的一个区域,您可以在其中引用该变量。

“生命周期”是程序执行期间存在的时间。

默认情况下,局部变量的生命周期与其作用域相同:

void foo()
{
    int x = 123;
    cout << x << endl;
    x += 1;
}

int main(){ foo(); foo(); foo(); }

在这里,每一次foo被称为新的x创建(在堆栈上为其保留空间),并且当执行离开该块时x被宣布,x被摧毁(对于int只是意味着保留的空间现在已被释放以供重用)。

相比之下:

void foo()
{
    static int x = 123;
    cout << x << endl;
    x += 1;
}

int main(){ foo(); foo(); foo(); }

在这里,自从x被宣布static, 空间被保留x在程序执行开始之前。x在内存中有一个固定的位置,它是静态变量。 C++ 对于此类变量的初始化有特殊规则:它在执行第一次通过声明时发生。

因此,在第一次调用中foo this x初始化,输出语句显示123,增量将值加1。在下一次调用中,初始化将被跳过(已经执行过),输出值124,并且该值再次增量。很快。

这个的寿命x是从执行开始到执行结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中变量的作用域与生命周期 的相关文章

随机推荐

  • Sequelize:查询 ARRAY 是否包含值

    假设我有一个 PG ARRAY 字段 id array 1 1 2 3 如何使用sequelize来查询数组字段是否为值1 I tried array contains 1 这给了我 array gt 1 有错误 Possibly unha
  • 垃圾收集器没有像 Android 应用程序中那样释放“垃圾内存”

    Hello 我是一名 Java 和 Android 开发新手 最近在处理应用程序的内存管理方面遇到了麻烦 我将把本文分成几个部分 以使其更清晰易读 我的应用程序的简要说明 这是一个由多个阶段 级别 组成的游戏 每个阶段都有一个玩家的起点和一
  • WooCommerce:验证我的帐户编辑页面上的自定义字段

    我已使用以下方式将自定义字段添加到我的 WooCommerce 注册中这个流程 https support woothemes com hc en us articles 203182373 How to add custom fields
  • 创建结构数组的最简单方法是什么?

    在 Cocoa 中创建结构数组的最简单方法是什么 如果你想使用 NSArray 你需要将你的结构装箱 您可以使用 NSValue 类对它们进行编码 像这样的编码 struct foo int bar struct foo foobar fo
  • F# 4 中的编译器错误?

    我有一些 F 4 0 源代码 可以在调试中正常编译 但在发布中则不行 没有条件定义 推断类型没有变化 我能想到的也没有其他东西可以向我解释这种差异 我真的偶然发现了编译器错误吗 这是有问题的代码片段 let oldItems userDis
  • Shapely 中两个几何体最近点的坐标

    有一条折线 其顶点坐标列表 x1 y1 x2 y2 x3 y3 和一个点 x y 在身材匀称中 geometry1 distance geometry2 返回两个几何图形之间的最短距离 gt gt gt from shapely geome
  • 将数据从 Excel 复制到记事本

    我使用以下命令将数据从 Excel 复制到记事本SendKeysExcel VBA 函数 我希望避免使用 sendkeys 我有这个代码 sub test dim wb as Workbook set wb C Documents test
  • 如何从 NSURLProtocol 内部获取请求 UIWebView

    我的应用程序使用 NSURLProtocol 的子类 应用程序中有多个 UIWebView 对于 NSURLProtocol 中实现的特定算法 我需要知道哪一个 UIWebView 发送请求 我的理解是 self client 返回的对象应
  • Shell 脚本 - Shell 变量不保留值

    bin bash while true do if eq 0 then result operand1 operand2 result operand1 operand2 result operand1 operand2 if result
  • 将列表元素追加到python中的列表列表中

    给出以下列表 list1 1 2 3 4 5 6 7 8 list2 10 11 12 13 最好的改变方式是什么list1所以它变成了Python中的以下列表 1 2 10 3 4 11 5 6 12 7 8 13 您可以使用zip x
  • anorm joda-time - 本地日期时间支持

    与 Anorm 2 5 2 SQL s insert into user name registered date values name registered date on name gt user name registered da
  • Hibernate Search - 如何默认列出所有记录

    我正在使用 Hibernate 搜索 我的 jsp 页面中有一个搜索文本框 如果我输入一些文本 它会返回正确的结果 但是 如果我留空消息并单击搜索按钮 它不会返回任何记录 Code Session session HibernateUtil
  • 将 COALESCE 与 Group by 结合使用

    我有一个表 其中包含如下数据 pid category name subcategoryname 424 Bathing Infant Care Baby Lotion 428 Bathing Infant Care Baby Lotion
  • QtWidgets.QFileDialog.getOpenFileName 返回一个元组

    我最近更新到了 Qt5 for Python 的新版本 在此过程中 我不得不根据发生的一些显着变化来更改我的代码 我想深入了解我创建的这行代码 这感觉像是一种肮脏的方式来解决获得一个问题的问题string代替tuple从函数 注意 0 在该
  • 嵌套 JSON:如何向对象添加(推送)新项目?

    我刚刚从数组 对象和 JSON 开始 所以希望我在这里忽略了一些简单的东西 我在尝试时遇到错误添加 推送 我的 json 对象中的一个新项目 我遇到以下错误 Result of expression library push undefin
  • 如何更改模式视图 iOS 6 上的状态栏

    我有以下星座 主视图 自定义 UIViewController 无导航控制器或导航栏 包含一个按钮 该按钮以模态方式连接到第二个表视图控制器 该控制器嵌入在导航控制器中 MainView gt 导航控制器 gt TableView 在 Ma
  • 生成后如何在expect shell脚本中获取子进程pid

    脚本的一部分a exp usr bin expect spawn ssh qTfnN D port user host expect assword 我怎样才能得到pid子进程 ssh 如果我在 bash shell 中执行这些 而不是在脚
  • 如何告诉 pyximport 使用 cython --cplus 选项?

    pyximport 非常方便 但我不知道如何让它使用 Cython 的 C 语言选项 从命令行运行cython cplus foo pyx 如何使用 pyximport 实现等效功能 谢谢 让 Cython 创建 C 文件的一种方法是使用
  • Javascript 对引用与值定义的变量的混淆

    我了解 javascript 语言的以下属性 var bar 1 var foo bar bar something entirely different foo is still 1 然而 当尝试将此逻辑应用于对象时 它的行为似乎有所不同
  • C 中变量的作用域与生命周期

    有人可以准确解释 C 中变量的范围和生命周期的概念吗 在 C 中是否有所不同 我对范围和生活感到困惑 变量的 范围 是源代码的一个区域 您可以在其中引用该变量 生命周期 是程序执行期间存在的时间 默认情况下 局部变量的生命周期与其作用域相同