MST

星途 面试题库

面试题:C语言循环中goto语句的恰当使用场景

在C语言循环中,goto语句常被认为破坏代码结构,但在某些特定场景下它有合理的使用方式。请举例说明至少两个在循环中使用goto语句能够简化代码逻辑或者提高程序性能的场景,并给出相应的代码示例,同时阐述为什么在这些场景下goto语句是合适的。
26.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

场景一:多层循环的快速跳出

  • 场景描述:在嵌套多层循环时,如果满足某个条件需要立即跳出所有循环,使用break只能跳出当前一层循环,使用goto可以直接跳出多层循环,简化代码结构。
  • 代码示例
#include <stdio.h>

int main() {
    int i, j;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (i * j == 6) {
                goto end_loop;
            }
        }
    }
end_loop:
    printf("跳出循环,此时i = %d, j = %d\n", i, j);
    return 0;
}
  • 合理性阐述:若不使用goto,可能需要设置额外的标志变量来控制多层循环的跳出,增加了代码的复杂度。而goto可以直接跳到指定位置,使跳出多层循环的逻辑更清晰直接。

场景二:错误处理与资源释放

  • 场景描述:在一段代码中,可能涉及多个资源的分配和操作,若其中某个操作失败,需要释放之前分配的所有资源。使用goto可以集中处理错误和资源释放,使代码逻辑更简洁。
  • 代码示例
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr1 = (int *)malloc(sizeof(int));
    if (ptr1 == NULL) {
        goto error;
    }
    int *ptr2 = (int *)malloc(sizeof(int));
    if (ptr2 == NULL) {
        free(ptr1);
        goto error;
    }
    // 正常的业务逻辑
    *ptr1 = 10;
    *ptr2 = 20;
    free(ptr1);
    free(ptr2);
    return 0;
error:
    printf("内存分配失败,进行错误处理\n");
    return 1;
}
  • 合理性阐述:通过goto将错误处理和资源释放集中在一个地方,避免了在每个可能出错的地方重复编写资源释放代码,使代码结构更清晰,也减少了因遗漏资源释放而导致内存泄漏的风险。