这在c ++中是一个很好的goto语句吗?

时间:2018-01-26 07:09:45

标签: c++ goto

伪代码:

if(testval == 1){
    routine_a:
        result = funcA();
} else {
    result = funcB();
    if(result.failed)
        goto routine_a;
}
// process result ...

这是一个很好的编程习惯吗? 或者有没有比goto-statement更好的方法来做到这一点?

6 个答案:

答案 0 :(得分:6)

您可以通过将其分解为单独的函数来避免重复该条件并避免goto。在那个单独的功能里面:

if (testval != 1) {
    auto result = funcB();
    if (!result.failed)
        return result;
}

return funcA();

答案 1 :(得分:2)

不,这不好。你永远不应该goto这样倒退,这是一个坏习惯,可能导致你跳过代码等的初始化,这可能导致未定义的行为。为什么不呢:

if(testval != 1){
    result = funcB();
}

if (testval == 1 || result.failed) { 
    result = funcA();
}

答案 2 :(得分:2)

转向逻辑将允许你:

if(testval != 1){
    result = funcB();
}
if((testval==1)||(result.failed)){
    result = funcA();
}

答案 3 :(得分:1)

我个人只是清楚地表明你想要两次调用funcA(在两个地方,不是两次调用它,它只被调用一次,但是来自两个可能的地方)。

所以:

if(testval == 1){
        result = funcA();
} else {
    result = funcB();
    if(result.failed)
    {
        result = funcA();
    }
}

在这里使用goto几乎没有什么可以获得的,这清楚地说明了你真正想要发生的事情 - 在两种完全不同的条件下调用FuncA。

答案 4 :(得分:0)

if( testval == 1 || (testval=funcB()).failed ) testval=funcA();

或者你可以这样做(或带一些旗帜)

testval.failed = true;
if(testval == 1)testval=funcB();
if(testval.failed)testval=funcA();

答案 5 :(得分:0)

  

这是一个很好的编程习惯吗?

取决于你,你的团队,如果你有你的团队,你的团队,如果你为一个人工作。

在我工作的地方,我们在代码库中的任何地方都没有使用goto,其中包含大约4000个源文件。这是一个观点问题,但使用goto语句,代码的可读性和可维护性较差。

根据您的代码片段,您可以轻松使用:

if(testval == 1){
   result = funcA();
} else {
   result = funcB();
   if(result.failed)
   {
      result = funcA();
   }
}