C 在这段代码中如何避免跳转
这是C的衍生物,所以请不要因为它看起来不正确而生气。这一做法确实是正确的 我有以下代码:C 在这段代码中如何避免跳转,c,goto,C,Goto,这是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");
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
}
我对GOTO和标签不是特别满意,所以我试着用do代替,但仍然剩下一个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()
将始终在检查返回值之前执行所有三个处理程序。我不想那样
可用结构:开关、转到、标签、FOR、WHILE、DO-WHILE、IF_ELSEIF_ELSE。也可以生成局部变量
你知道如何在不使用GOTO的情况下重写此代码吗?更改此选项
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");
我建议使用与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;
}
这里有一个变体
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
}
使用标志变量表示:
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
}
简单,使用子功能:
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
}
我没有尝试上面的代码,但我相信它是有效的。别忘了检查这是否是你真正想要你的程序做的,因为也许我的想法错了
顺便说一句,我希望我能帮助你,我很抱歉我的英语不好。祝你好运 此代码没有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
}
将此与提供的一些糟糕的替代方案进行比较:
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
}
如果不是C,就不要给它贴标签。然后建议一些更好的标签。这是C语法,任何C方法都适用于我。没有标记比错误的标记更好。@meagar现在我没有语法高亮显示和视图。我把标签加了回去。“任何C方法都适用于我。”这不是真的,正如你已经清楚地证明的那样。C的方法是依靠操作员短路。但是我仍然有一个goto:(这是goto的一个非常合理的用法。好的,我走这条路。它是迄今为止最干净的。哦,但是…功能不同。我需要一个“完成”在成功和失败后执行的部分。另一个goto?开始让它变得混乱。如果代码所做的事情有意义,我可能会说将其作为一个函数,然后将其包装到一个始终运行的逻辑的函数中。添加标志变量只会使代码混乱。goto很好。所以你想让fhe代码可读性差,这样你就可以调用goto或其他东西。这是一个可怕的错误idea@IraBaxterEdsger Dijkstra可能不同意你的观点(我同意这在这里并不不合理),但OP特别要求使用一种没有goto或标签的方法。@camelcc为什么回答OP的问题是我想要的呢?@ElliottFrisch:你知道Dijkstra在结构化编程刚刚开始时就发表了这篇文章吗?它不是反对偶尔的
goto
,而是反对无处不在且总是使用goto
。而且,我也不反对ink他曾鼓吹过迂回编码,以教条的方式避免goto
101。然后处理程序都会被执行。这看起来很好。有一件事,你可以在ifs中使用默认的good=1,在ifs中使用空语句,在最后一种情况下使用good=0;我想。@Quentin这是首选的,但OP没有合适的| |运算符在常规C中可以,但这里表达式中的所有函数都是先求值的,然后检查表达式-所以每次都会调用所有的处理程序。它们非常慢,而且调用成本很高,所以我宁愿避免这种情况。
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
}