goto语句

来自cppreference.com
< c‎ | language

将控制无条件转移到所欲位置。

在用常规构造就无法将控制转移到所欲位置时使用。

目录

[编辑] 语法

goto label ;
label : statement

[编辑] 解释

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

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

进入非可变修改变量的作用域是允许的:

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

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

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

[编辑] 关键词

goto

[编辑] 注意

因为声明不是语句,在声明前的标号必须使用空语句(一个紧随冒号后的分号)。同样的做法适用于在块结尾前的标号。、

C++加上了另外的goto语句限制,不过允许标号在声明(它们在C++中是语句)前。

[编辑] 示例

#include <stdio.h>
 
int main(void)
{
    // goto可用于便捷地离开多层循环
    for (int x = 0; x < 3; x++) {
        for (int y = 0; y < 3; y++) {
            printf("(%d;%d)\n",x,y);
            if (x + y >= 3) goto endloop;
        }
    }
endloop:;
}

输出:

(0;0)
(0;1)
(0;2)
(1;0)
(1;1)
(1;2)

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 6.8.6.1 The goto statement (p: 152-153)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.8.6.1 The goto statement (p: 137-138)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.6.6.1 The goto statement

[编辑] 参阅

goto语句C++ 文档