这是C的衍生物,所以请不要生气,因为它看起来不正确。在这个实现中确实是正确的。
我有这段代码:
func() {
if (handler_1()) goto good;
if (handler_2()) goto good;
if (handler_3()) goto good;
print("BAD");
goto done;
good:
print("GOOD");
goto done;
done:
print("DONE");
// do some common stuff
}
我对gotos和标签不是特别满意,所以我尝试使用do-while,但仍有一个GOTO。
func() {
do {
if (handler_1()) break;
if (handler_2()) break;
if (handler_3()) break;
print("BAD");
goto done;
} while(false);
print("GOOD");
done:
print("DONE");
// do some common stuff
}
注意 - 该语言不使用短路评估:
handler_1() || handler_2() || handler_3()
在检查返回值之前,将始终执行所有三个处理程序。我不希望这样。
可用结构:SWITCH,GOTO,LABEL,FOR,WHILE,DO-WHILE,IF_ELSEIF_ELSE。也可以制作局部变量。
如何在不使用GOTO的情况下重写此代码的任何想法?
答案 0 :(得分:7)
我建议使用与您在linux内核中经常看到的类似的语法。
func() {
if (!handler_1())
goto fail;
if (!handler_2())
goto fail;
if (!handler_3())
goto fail;
print("success");
return 0;
fail:
print("failure");
return -1;
}
答案 1 :(得分:6)
这是一个变体
func() {
int good = 0;
if (handler_1())
good = 1;
else if (handler_2())
good = 1;
else if (handler_3())
good = 1
if (good) {
print("GOOD");
} else {
print("BAD");
}
print("DONE");
// do some common stuff
}
答案 2 :(得分:4)
将此与一些可怕的替代方案进行比较:
handle() {
if (handler_1()) return true;
if (handler_2()) return true;
if (handler_3()) return true;
return false;
}
func(){
print(handle() ? "GOOD" : "BAD");
print("DONE");
/// do some common stuff
}
答案 3 :(得分:3)
简单,使用子功能:
handler_any() {
if(handler_1())
return 1;
if(handler_2())
return 1;
return handler_3();
}
func() {
if (!handler_any()) {
print("BAD");
} else {
print("GOOD");
}
print("DONE");
// do some common stuff
}
答案 4 :(得分:2)
func() {
if (handler_1() || handler_2() || handler_3())
print("GOOD");
else print("BAD");
print("DONE");
// do some common stuff
}
我没有尝试上面的代码,但我相信它有效。不要忘记检查这是否是你真正希望你的程序做的事情,因为我可能错了。
顺便说一下,我希望我帮助你,对我糟糕的英语感到抱歉。祝你好运!答案 5 :(得分:1)
更改此
if (handler_1()) goto good;
if (handler_2()) goto good;
if (handler_3()) goto good;
bad:
print("BAD");
goto done;
good:
print("GOOD");
goto done;
类似
bool good = true;
if (!handler_1()) {
if (!handler_2()) {
if (!handler_3()) {
good = false;
}
}
}
if (good) {
printf("Good");
} else {
printf("Bad");
}
printf("Done");
答案 6 :(得分:1)
使用标志变量is_good表示:
func() {
int is_good = 0;
if (handler_1()) is_good = 1;
else if (handler_2()) is_good = 1;
else if (handler_3()) is_good = 1;
if (is_good == 1)
{print("BAD");}
else
{print("GOOD");}
print("DONE");
// do some common stuff
}
答案 7 :(得分:0)
此代码没有gotos且没有任何标志,可以正常工作
func() {
if (!handler_1()) {
if (!handler_2()) {
if (!handler_3()) {
print("BAD");
}
else {
print("GOOD");
}
}
else {
print("GOOD");
}
}
else {
print("GOOD");
}
print("DONE");
// do some common stuff
}