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++标准条款核心判断逻辑是:回跳越过已初始化的自动存储期变量时,仅销毁跳转出发点存在、但跳转目标点不存在的自动对象,对应到你的代码:
- 跳转目标
label_one的位置在int b = 3定义语句之后、int j = 10定义语句之前,三者都在同一个if块作用域内。 - 当
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
相关产品推荐
相关产品推荐

