我几个月来一直用C ++编程,当我通过论坛时,我注意到了一个趋势。似乎goto
语句通常被认为是完全错误的使用,或者只应在非常特定的情况下使用。什么是goto
语句使它们如此根本错误?
答案 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
从循环中间退出一样。)一般来说,如果你想能够推断代码的正确性,你想要进入顶部的每个块,并将其保留在底部。并且无法推断代码的正确性,您无法确定它是否正确。