在此作用域中尚未声明_C/C++中的goto语句

本文详细介绍了C++和C语言中的goto语句,它是无条件转移控制流的一种方式,用于在特定情况下跳转到程序的其他部分。尽管goto语句在某些场景下有用,但也可能导致代码难以理解和维护。文章通过示例展示了goto在多层循环中的应用,并讨论了其使用限制,如不能进入或离开try-catch块以及变长数组的作用域。此外,还提到了不同编程语言中goto语句的差异,例如C++中对自动变量的处理规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

goto 语句

无条件转移控制流。

当使用其他语句不可能将控制转移到所需位置时使用。

1d69cde53c0c41cd9db3abf0950703fc.png

语法

属性(可选) goto 标号 ;

C++解释

goto 语句将控制转移到标号所指定的位置。goto 语句必须与它所用的 标号 处于相同的函数中,它出现于标号的前后均可。

若控制的转移退出了任何自动变量的作用域(例如通过回跳到这种变量声明之前的位置,或向前跳出作为变量作用域的复合语句),则为所有退出作用域的变量以其构造顺序的逆序调用析构函数。

goto 不能将控制转移到 try 块或 catch 子句之内,但能将控制转移离开 try 块或 catch 子句(遵循上述有关作用域中的自动变量的规则)

若控制被转移进入了任何自动变量的作用域(例如通过向前跳过声明语句),则程序非良构(不能编译),除非进入作用域的所有变量拥有

  1. 标量类型,且声明不带初始化器
  2. 拥有平凡默认构造函数和析构函数的类类型,且声明不带初始化器
  3. 上述之一的 cv 限定版本
  4. 上述之一的数组

(注意:相同规则适用于控制转移的所有形式)

注意

在 C 编程语言中,goto 语句的限制较少,并且能进入除变长数组或可变修改指针之外的任何变量的作用域。

C解释

goto 语句导致无条件跳转(控制的转译)到前附具名 标号 (必须与 goto 语句出现于同一函数中)的语句,除非此跳转会进入变长度数组或另一可变修改类型的作用域 (C99 起)。

标号 是一个后随冒号( : )和一条语句的的标识符。标号是仅有的拥有函数作用域的标识符:能在其所出现于的函数中的任何位置使用它们(在 goto 语句中)。任何语句前可以有多个标号。

goto lab1; // OK :进入常规变量的作用域 int n = 5;lab1:; // 注意未初始化 n ,如同以 int n; 声明 // goto lab2; // 错误:进入二个 VM 类型的作用域 double a[n]; // VLA int (*p)[n]; // VM 指针lab2:

若 goto 离开 VLA 的作用域,则 VLA 会被解分配(而且可能会被再分配,若再度执行其初始化):

{ int n = 1;label:; int a[n]; // 重分配 10 次,每次拥有不同的大小 if (n++ < 10) goto label; // 离开 VM 的作用域}

示例

#include  int main(void){ // goto 可用于简单地离开多层循环 for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { printf("(%d;%d)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值