Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在这段代码中如何避免跳转_C_Goto - Fatal编程技术网

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");

这是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
}
我对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
}