You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中goto语句跳转时变量销毁规则与b变量初始化问题

#include <iostream>
using namespace std;
int main() {
    if (true) {
        int b = 3;
    label_one:
        cout << b << endl;
        int j = 10;
        goto label_one;
    }
}

变量b的行为结论

  • b不会在每次goto循环中被销毁重建,也不会出现非法访问问题,它的值会始终保持初始化的3,直到整个if块退出才会被销毁。
  • 由于当前代码是死循环,永远不会退出if块,因此程序运行期间b不会被C++运行时主动销毁。

原理说明

你引用的C++标准条款核心判断逻辑是:回跳越过已初始化的自动存储期变量时,仅销毁跳转出发点存在、但跳转目标点不存在的自动对象,对应到你的代码:

  1. 跳转目标label_one的位置在int b = 3定义语句之后、int j = 10定义语句之前,三者都在同一个if块作用域内。
  2. 当goto从j定义完成的位置跳回label_one时:
    • b在跳转目标点已经完成初始化、属于合法存在的对象,因此不会被销毁,也不会重新执行int b = 3初始化逻辑,值会一直保留。
    • j在跳转目标点还未定义,因此会被销毁,下次执行到int j = 10时会重新初始化,和你认知的行为一致。

常见理解误区纠正

你认为if作用域内所有变量都会被销毁是错误的:只有当跳转目标点位于变量的定义语句之前时,才会触发该变量的销毁。如果把label_one移到int b = 3之前,那每次goto跳回时都会先销毁b,再重新执行初始化语句赋值3。

你可以把b替换为自定义类,在构造、析构函数中加打印,就能观测到b的构造仅执行一次,不会随goto循环重复执行,验证上述结论。

内容的提问来源于stack exchange,提问作者user15071942

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:39:05