C++编程法则365天一天一条(2)goto语句的一些坑

news/2024/11/2 15:26:35/

如果使用非本地跳转语句(如goto)从自动变量的作用域退出(即跨越了自动变量的声明所在位置),比如从某个语句块的内部向外跳出,或者从一个函数的任何位置返回时,那么程序会按照它们创建时相反的顺序调用所有已定义析构函数的自动变量进行销毁操作。

换句话说,C++编译器将按照变量定义的相反顺序调用自动变量的析构函数,以保证在变量结束其生命周期之前能够完成它们所需的清理工作(比如释放分配的内存等)。具体过程可以简单概括为:

  1. 当自动变量被声明时,它们被创建并初始化。
  2. 当自动变量的作用域结束时(例如,离开特定语句块,返回到函数外部),它们会被销毁,并按照它们创建的相反顺序调用析构函数。这意味着最后定义的变量会先被销毁。

如果使用了跳转语句(如goto)进入了自动变量的作用域,程序就会非法(无法通过编译),除非所涉及的变量都具有以下特点:

  1. 声明了而没有初始化的标量类型(如整型、浮点型等)。
  2. 声明了而没有初始化,并且具有平凡默认构造函数和析构函数的类类型。
  3. 类型为上述两种情况中一种或多种CV修饰版本(如const或volatile等)。
  4. 其中一个以上的上述情况形成的数组类型。

换句话说,如果要从一个变量声明(例如、int x;语句)之后跳转到该变量的作用域内,就必须确保变量满足上述任一特定情境,否则程序将被视为“无法编译”,并抛出编译错误信息。这个规定主要是为了防止程序中存在未初始化的变量,它们可能引发各种难以预料的问题和未定义行为。

需要注意的是,上述规定仅适用于自动变量,在栈中分配内存的对象,对于静态变量或全局变量来说则不适用。此外,即使条件允许自动变量跨越作用域,也应该谨慎使用非本地的控制转移语句,如gotolongjmp。遵循良好的编码实践和规范,可以减少由于程序错误和不当编码而导致的问题,提高代码的可维护性和健壮性。

例如:

    goto label;int x = 1;
label:std::cout << x;

这段代码编译出错。


http://www.ppmy.cn/news/81803.html

相关文章

基于STC8G1K08A的水压检测系统

基于STC8G1K08A的水压检测系统 前言先来一饱眼福设计和硬件的选型压力传感器选择单片机的选择WIFI透传模块选择 核心代码的开发STC8G1K08A单片机代码读取水压传感器的电压计算对应电压水的压力值猪场水压正常、漏水、喝光水提醒功能的实现 数据通过ESP8266上报到云端代码的实现…

【分立元件】MOSFET的工作原理

MOSFET适用于瓦至十数千瓦的中小功率,特别适用于电源管理行业的入门学习。IGBT和MOSFET使用相似,但属于中大功率场合才使用,如果想使用好IGBT,也要先学习MOSFET。 对于MOSFET的学习我们需要学习它的工作原理,知道MOSFET的主要参数,MOSFET的开关过程以及如何驱动MOSFET,应…

MySQL——聚合函数

我们上一篇讲到了 SQL 单行函数。实际上 SQL 函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。接下来我们来看看什么是聚合函数及聚合函数的分类 1. 聚合函数介绍 1.1 什么是聚合函数? 聚合函数作用于…

Android开发不可缺少的辅助工具

目录 jadxandroid_toolscrcpy-guiCode CraftsSQLite Expert Personal jadx jadx是一款apk反编译工具。 PS&#xff1a;部分版本安装&#xff0c;无法打开类文件&#xff0c;需换个版本。 开源地址&#xff1a;https://github.com/skylot/jadx android_tool android_tool可以通…

Spring 之 jwt,过滤器,拦截器,aop,监听器

Spring 之 jwt&#xff0c;过滤器&#xff0c;拦截器&#xff0c;aop&#xff0c;监听器 一、jwt编写1.1 pom1.2 JwtUtils1.3 注意1.4 用法 二、过滤器2.1 原理2.2 使用场景2.3 使用步骤2.3.1 自定义过滤器类implements Filter2.3.2 配置类2.3.3 过滤器使用场景 2.4 问题 三、拦…

线性回归、正规方程和梯度下降法

一、线性回归简介 1.定义与公式 线性回归是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。 特点&#xff1a;只有一个自变量的情况称为单变量回归&#xff0c;多余一个自变量情况的叫做多元回归 通用公式&#xff1a; y …

java 社区人口管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 社区人口管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

程序员必须避免的7个代码陷阱,否则你会成为 “debugger“ 的王者!

作为一名程序员&#xff0c;编写高质量、可维护、安全且高效的代码是非常重要的。然而&#xff0c;由于程序员的工作涉及到许多技术和细节&#xff0c;因此很容易陷入各种技术陷阱。下面将详细介绍程序员在编写代码时需要避免的一些常见陷阱。 1. 忽略代码质量和可维护性 在编…