伪代码:
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();
}
}