为什么goto语句在C ++中被视为禁忌?

时间:2013-04-28 18:27:22

标签: c++ syntax goto

我几个月来一直用C ++编程,当我通过论坛时,我注意到了一个趋势。似乎goto语句通常被认为是完全错误的使用,或者只应在非常特定的情况下使用。什么是goto语句使它们如此根本错误?

2 个答案:

答案 0 :(得分:7)

最大的原因是它使代码很难遵循。 goto并非隐含不良;用它编写难以理解的代码很容易。

例如,您更愿意阅读哪个?这样:

int factorial(int n) {
    int result;

    if(n==0 || n==1)
        result = 1;
    else
        result = n*factorial(n-1);

    return result;
}

或者这个:

int factorial(int n) {
    int result;

    if(n > 1)
        goto big;

    result = 1;
    goto end;

big:
    result = n*factorial(n-1);

end:
    return result;
} 

这两种实现方式与机器相同,但第一种对我们的人眼来说更清晰。但有时候goto 更清晰。例如,从C(或C ++,无例外)考虑这一点:

void process_big_file(FILE* foo) {
    if(possible_failure_1(foo))
        goto cleanup;

    // Do some work

    if(possible_failure_2(foo))
        goto cleanup;

    // Do some more work

cleanup:
    fclose(foo);
}

在这里,使用goto是有意义的,因为它允许您将所有清理代码放在一个位置,而goto实际上创建了一个逻辑执行流。特别是,在阅读代码时,很明显您总是(a)达到清理代码,并且(b)始终到达相同的清理代码,这是重要的事情。在没有例外的情况下,我实际上认为goto在尝试组织(例如)清理代码时是正确的事情。

答案 1 :(得分:0)

主要原因是goto使得代码的推理极其困难,如果不是不可能的话。 (注意,“隐藏”goto的含义相同,就像使用break从循环中间退出一样。)一般来说,如果你想能够推断代码的正确性,你想要进入顶部的每个块,并将其保留在底部。并且无法推断代码的正确性,您无法确定它是否正确。