【问题标题】:How to use Goto function如何使用转到功能
【发布时间】:2013-08-23 18:02:34
【问题描述】:

我可以使用 Goto 跳转到其他功能吗?例如

void x(){
 printf("hello");
}

void y(){
 printf("hi");
}

int main(){     /*assume that all var are declared */

 scanf("%d",&input);
  if(input == 1) goto y();
  else(input == 2) goto x();
}

【问题讨论】:

  • 你试过编译吗?
  • 指针 - > goto 不是一个函数,它是一个跳转语句 - 而是一个 evil 语句
  • @sansix:“邪恶”是纯粹的修辞,goto 有它的用途,就像汇编器有它的用途一样。
  • 它的实际用途比实际用途要有限得多。在代码中使用 goto 的最大问题(尽管从这个示例中可能不那么明显)是它使您的代码难以维护。例如,如果您有一个大约 30,000 行代码的程序,并且到处都有 goto。您将在代码中上下跳跃,这种方式不一定符合逻辑,无法弄清楚它到底在做什么。

标签: c function goto


【解决方案1】:

您不能使用goto 分支到不同的函数; goto 只能在当前函数内分支。您只需调用函数x()y()

【讨论】:

    【解决方案2】:

    在大多数情况下,goto 是一个坏主意,通常可以避免。在这个例子中,它可以这样做:

    if (input == 1)
    {
     y();
    }
    else
    {
     x();
    }
    

    【讨论】:

      【解决方案3】:

      从您的问题看来,您正在学习 C 并且您一般是编程新手。如果是这种情况,我强烈建议你遵循一本好书。对于新手来说,C 不是一种简单的边做边学的好语言。它有很多陷阱,很容易在错误的地方添加逗号或分号,并且有一个完美运行(即编译和运行)的程序,它没有你所期望的! C 不像 Java 或 Python 那样牵着你的手。

      至于您的问题,this 参考可能有用。

      另一个建议:与goto 一起学习它的语法和语义,然后尽量避免在“真正的代码”中使用它,直到你成为专家级 C 程序员。几乎任何程序都可以在没有gotos 的情况下创建。当专家级程序员求助于gotos 可能是因为:

      • 它正在实施一些优化技巧,或者
      • 手头的算法非常棘手,属于goto 使代码更具可读性的罕见情况之一。

      【讨论】:

      • goto 在 C 中使事情更具可读性一点也不“罕见”。它是在 C 中进行错误处理的最易读和最不容易出错的方法。 grep Linux 内核源让“goto”得到一个想法。
      • @asveikau 抱歉回复晚了(我错过了你的评论)。你是对的,我可能选错了词。我的意思是强调 goto 的使用有些“特殊”(我选择了初学者 POV - 唉,初学者很少在教科书和基础课程中看到良好的错误处理技术),并且良好的错误处理很棘手 .
      【解决方案4】:

      永远不要使用 goto。它丑陋、陈旧并且不必要地混淆了事物。

      int main() {     /*assume that all var are declared */
      
          scanf("%d",&input);
          if(input == 1) {
              y();
          } else if (input == 2) {
              x();
          }
      }  
      

      【讨论】:

      • 没有。 goto 其合法用途,例如它可以用来有效地从嵌套循环中跳出,即不使用额外的变量,或者对状态机进行编码。它的 abuse 是错误的,也就是说,对于任何可以使用普通结构化控制流语句完成的任务,您都应该避免它。它就像一把手提钻:没有它你可以推倒一堵混凝土墙,但它是掌握在知道自己在做什么的专家手中的正确工具。
      • 操作词是expert,OP远非如此。
      • 这不是问题的答案,只是一些人一看到goto这个词就开始的争论。
      • @JensGustedt 有一个很好的理由可以得出这样的答案,尤其是对于那些刚接触编程的人(在这种情况下似乎是 OP)。我认为 goto 如此迅速地被新程序员击倒的原因是因为潜在的不正确使用/滥用。
      • @user2366842,这实际上是一场持续了几十年的斗争。双方都有很好的推理,也有很多意识形态、争论和反复出现在“权威”上。请不要再在这里开始这些战争。 SO 不适合这种事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多