goto 语句
来自 cppreference.com
无条件地将控制权转移到所需位置。
当使用传统结构无法将控制权转移到所需位置时使用。
内容 |
[编辑] 语法
attr-spec-seq(可选) goto label ; |
|||||||||
label | - | goto 语句的目标 标签 |
attr-spec-seq | - | (C23)goto 语句的可选 属性 列表 |
[编辑] 说明
goto
语句会导致无条件跳转(控制权转移)到以命名 label 为前缀的语句(该语句必须与 goto 语句出现在同一个函数中),除非该跳转会进入 变长数组 或其他 可变修改类型 的范围。(自 C99 起)
一个 label 是一个标识符后面跟着一个冒号 (:
) 和一个语句(直到 C23)。标签是唯一具有函数范围的标识符:它们可以在出现它们的同一个函数的任何地方(在 goto 语句中)使用。任何语句之前可能存在多个标签。
允许进入非可变修改变量的范围 goto lab1; // OK: going into the scope of a regular variable int n = 5; lab1:; // Note, n is uninitialized, as if declared by int n; // goto lab2; // Error: going into the scope of two VM types double a[n]; // a VLA int (*p)[n]; // a VM pointer lab2: 如果 { int n = 1; label:; int a[n]; // re-allocated 10 times, each with a different size if (n++ < 10) goto label; // leaving the scope of a VM } |
(自 C99 起) |
[编辑] 关键字
[编辑] 注释
由于声明不是语句,因此声明之前的标签必须使用空语句(冒号后面紧跟分号)。对于块末尾之前的标签也适用。 |
(直到 C23) |
C++ 对 goto
语句施加了额外的限制,但允许在声明之前使用标签(在 C++ 中它们是语句)。
[编辑] 示例
运行此代码
#include <stdio.h> int main(void) { // goto can be used to leave a multi-level loop easily 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)
[编辑] 参考资料
- C17 标准 (ISO/IEC 9899:2018)
- 6.8.6.1 goto 语句 (p: 110-111)
- C11 标准 (ISO/IEC 9899:2011)
- 6.8.6.1 goto 语句 (p: 152-153)
- C99 标准 (ISO/IEC 9899:1999)
- 6.8.6.1 goto 语句 (p: 137-138)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 3.6.6.1 goto 语句
[编辑] 另请参见
C++ 文档 for
goto 语句 |