goto statement
后藤声明
无条件转移控制权。
在其他情况下无法使用其他语句将控制转移到所需位置时使用。
句法
attr(optional) goto label ; | | |
---|
解释
Goto语句将控制转移到标签。Goto语句必须与它所引用的标签具有相同的功能,它可能出现在标签之前或之后。
如果控制的转移退出任何自动变量的范围%28,例如。通过向后跳到这些变量声明之前的点,或者跳出变量范围为%29的复合语句,对其作用域已退出的所有变量调用析构函数,其顺序与其构造顺序相反。
大goto
语句不能将控制转移到试块或者进入CATC-子句,但可以将控制权从TRY块或CATC-子句%28中传输出去。以上有关范围内自动变量的规则遵循%29。
如果控制的转移进入任何自动变量的范围%28,例如。通过跳过声明语句%29,程序格式错误的%28不能编译%29,除非输入其作用域的所有变量都有。
1%29种标量类型没有初始化器声明
2%29种类类型,其中包含普通默认构造函数和不带初始化器的平凡析构函数。
3%29 cv-上述一种的合格版本
4%29个以上数组之一
%28注:相同的规则适用于所有形式的控制转移%29。
关键词
goto
...
注记
在C编程语言中,goto
语句具有较少的限制,并且可以输入除可变长度数组或可变修改指针以外的任何变量的作用域。
例
二次
#include <iostream>
struct Object {
// non-trivial destructor
~Object() { std::cout << "d"; }
};
struct Trivial {
double d1;
double d2;
}; // trivial ctor and dtor
int main()
{
int a = 10;
// loop using goto
label:
Object obj;
std::cout << a << " ";
a = a - 2;
if (a != 0) {
goto label; // jumps out of scope of obj, calls obj destructor
}
std::cout << '\n';
// 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++) {
std::cout << "(" << x << ";" << y << ") " << '\n';
if (x + y >= 3) {
goto endloop;
}
}
}
endloop:
std::cout << '\n';
goto label2; // jumps into the scope of n and t
int n; // no initializer
Trivial t; // trivial ctor/dtor, no initializer
// int x = 1; // error: has initializer
// Object obj2; // error: non-trivial dtor
label2:
{
Object obj3;
goto label3; // jumps forward, out of scope of obj3
}
label3: ;
}
二次
产出:
二次
10 d8 d6 d4 d2
(0;0)
(0;1)
(0;2)
(1;0)
(1;1)
(1;2)
dd
二次
再读
著名的Edsger W.Dijkstra的文章,“被认为有害的后人”,概述了这个关键字的粗心使用所能带来的许多微妙问题。
另见
c后藤的文件
*。
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。