如何在此代码中避免使用GOTO

时间:2014-09-12 17:43:56

标签: 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");
    // 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的情况下重写此代码的任何想法?

8 个答案:

答案 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
}