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



伪代码:

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

这是一个好的编程实践吗?
还是有比goto语句更好的方法可以做到这一点?

您可以通过将其分解到单独的函数中来避免重复条件并避免goto。在该单独的函数中:

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

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

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

扭转逻辑将允许您执行以下操作:

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

我个人只想明确表示您想调用funcA两次(在两个地方,不是两次调用它,它只会被调用一次,而是从两个潜在的地方调用(。

所以:

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

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

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


或者

你可以这样做(或者用一些标志(

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

这是一个很好的编程实践吗?

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

在我工作的地方,我们没有在由大约 4000 个源文件组成的代码库中使用过goto。这是一个意见问题,但代码的可读性和可维护性较差,goto语句。

给定您的代码片段,您可以轻松使用:

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

最新更新