如果使用 goto 将控制权转移到 if(false) 块会发生什么?

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分支不会被执行。