C++ Goto 语句

2025年4月24日 | 阅读 6 分钟

C++ 使用 goto 语句 作为跳转语句,它使程序员能够将程序执行定向到当前函数内预定义的标签。该程序语句无条件执行,然后将控制权转移到同一函数内的定义位置。

它用于将控制权转移到程序的其他部分。它无条件跳转到指定的标签。它可以用于从深度嵌套循环或 switch case 标签中转移控制权。

语法

它具有以下语法:

C++ goto 语句中,标签可以在同一作用域的任何地方。

goto 语句的流程图

C++ Goto Statement

goto 语句的简单示例

示例

编译并运行

输出

You are not eligible to vote!
Enter your age:
16
You are not eligible to vote!
Enter your age:
7
You are not eligible to vote!
Enter your age:
22
You are eligible to vote!

说明

在此示例中,我们使用 goto 语句来检查多个条件。我们还使用了一个不适合 goto 语句的条件。

我们为什么使用 goto 语句?

程序员在 C++ 编程中使用 goto 语句 的情况是,需要从深层循环中中断任务,或通过简化的代码结构处理特定的错误。过度使用 goto 会增加代码复杂性,从而妨碍理解和代码维护操作。

goto 的主要目标是在不同标签之间切换程序执行。结构化编程不提倡频繁使用 goto 语句,但当替代方法难以实现时,程序员可以从该语句中受益。

我们什么时候使用 Goto 语句?

  • 退出深度嵌套循环: 用户可以通过巧妙地使用 goto 一次性 中断 多个嵌套循环。
  • 简单程序中的错误处理: 该语句通过在缺乏结构化错误处理要求的程序中进行基本异常管理,提供简单的错误处理。
  • 跳转到函数中的特定部分: 利用 goto 语句可以让我们到达函数中的特定位置,从而减少不必要的代码。

C++ Goto 语句示例

让我们再看一个 C++ 中 goto 语句的示例。

退出深度嵌套循环

示例

编译并运行

输出

111
112
113
121
122
123
131
132
133
211
212
213
221
222
Exited all loops!

说明

在此示例中,当满足特定条件时,goto 用于跳出多个嵌套循环。

不带异常机制的错误处理

示例

编译并运行

输出

Enter a positive number: -5  
Error! Negative numbers are not allowed.  

说明

在这里,当提供了无效输入时,goto 函数通过跳转到错误消息来简化错误处理。

跳过某些代码块的执行

示例

编译并运行

输出

Processing data...  
Execution resumed after skipping.  

说明

在这里,程序直接跳转到 skip,忽略中间的语句。

使用 goto 语句的优点

在 C++ 中使用 goto 语句的几个优点如下:

  • 在某些情况下简化控制流: goto 语句在特定条件适用时使控制流更易于管理,因为它允许从多个嵌套循环中快速跳出。
  • 减少代码重复: 该语句有助于用户避免在特定编程情况下编写重复条件。
  • 提供快速错误处理(在简单情况下): 通过其快速错误处理机制(在基本错误情况下),无需 异常处理 即可进行快速错误管理。

Goto 语句的缺点

在 C++ 中使用 goto 语句的几个缺点如下:

  • goto 语句可能会降低模块化,因为代码变得依赖于特定标签而不是可重用函数。
  • 几乎所有 goto 语句的用例都可以用函数、循环 和异常处理 (try-catch) 来替代。
  • 它使代码模块化程度降低,更难管理。
  • 使用 goto 语句,代码通常会变得比必要复杂,使其难以重写或改进。

常见问题解答

1. 开发人员何时需要在 C++ 编程中使用 goto 语句?

'goto' 语句主要用作控制机制,将执行定向到同一函数块中找到的精确标签。goto 语句提供了强大的功能,可用于退出深度嵌套循环,并处理简单的错误和程序跳过操作。应避免过多的 goto 语句,因为它们会造成阅读复杂性并降低维护质量。 

2. 什么场景使得 'goto' 不适合在 C++ 中使用?

当我们可以通过使用结构化编程元素(例如 'for' 和 'while' 循环以及 'if-else' 条件语句和函数)来实现相同的结果时,我们应该避免使用 'goto' 语句。我们应该尽量减少 'goto' 的使用,因为这种做法会使程序员的代码检查复杂化,并创建被称为“面条式代码”的无组织编程逻辑。

3. 当我们需要退出嵌套循环时,goto 扮演什么角色?

单次使用 break 只会终止当前循环,但我们需要退出多个循环。goto 语句允许程序员直接导航到所有循环之外存在的标签,从而完成它们的退出。该语句对于需要中断多个循环迭代的情况来说是一个有益的解决方案。 

4. C++ 是否提供了一个 goto 语句,允许从函数到函数的跳转?

goto 命令在执行期间仅在一个函数内部起作用。将执行控制权从一个函数转移到另一个函数是不可能的,因为这种做法会破坏结构系统并产生未指定的结果。 

5. 当代 C++ 编程中,哪些方法取代了 'goto' 关键字?

当前的 C++ 编程语言包含了三个更好的解决方案:使用 "break"、"continue" 语句的循环,以及通过 "try-catch" 块和使用函数与条件语句的结构化元素进行的错误处理。这些不同的代码选项可以生成可维护且可读的程序,实现与 goto 语句类似的功能。


下一主题C++ 注释