Be *_* Ku 18 c++ goto language-lawyer
我想通过尝试解决一个困难的“嵌套条件”问题来考虑以下代码:
goto error;
if (false)
{
error:
cout << "error block" << endl;
}
else
{
cout << "else block" << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,仅error block按预期显示(我猜?)。但这是所有编译器都定义的行为吗?
cig*_*ien 14
是的,这是很好的定义。来自stmt.goto#1
goto 语句无条件地将控制转移到由标识符标记的语句。标识符应是位于当前函数中的标签。
有一些限制,例如案例标签不能跨越非平凡的初始化
goto error;
int i = 42;
error: // error: crosses initialization of i
Run Code Online (Sandbox Code Playgroud)
但是这些不适用于您的示例。此外,在跨越初始化的情况下,这是一个硬编译器错误,因此您不必担心未定义的行为。
请注意,一旦跳转到 case label error,您实际上就处于if条件的真实分支内,并且通过goto. 所以你可以保证else分支不会被执行。