伪代码:
if(testval == 1){
routine_a:
result = funcA();
} else {
result = funcB();
if(result.failed)
goto routine_a;
}
// process result ...
这是一个很好的编程习惯吗? 或者有没有比goto-statement更好的方法来做到这一点?
答案 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();
}
}