【问题标题】:Question about "goto" in C关于C中“goto”的问题
【发布时间】:2010-11-29 01:51:00
【问题描述】:

我正在尝试理解 C 代码。在某些地方有:

for ...{
    if condition{
       a=1;
       break;
    }
}

在以后的版本中改为:

for ...{
    if condition{
       goto done;
    }
}
done: a=1;

在我看来,两个版本应该给出相同的结果,但它不会发生。你知道为什么吗?

更正:修复是:

for ...{
    if condition{
       goto done;
    }
}

            goto notdone;
            done: 
                ok=0;
            notdone:

【问题讨论】:

  • 这是整个代码还是有更多的嵌套循环?
  • 不,没有更多的嵌套循环
  • 我看到您的更正,我承认它与版本 1 相同,但我不明白为什么您会用另一个使用不直观的 goto s 集的解决方案替换完美的解决方案...

标签: c break goto


【解决方案1】:

这取决于for循环是否还有其他退出条件。

  • 在第一个示例中,a=1 仅针对 if 语句中的特定退出条件发生。

  • 在第二个示例中,a=1 发生在退出循环的所有场景中。它只能使用return 语句或另一个goto 语句来规避。

【讨论】:

  • +1 以获得好的答案;流分析是解开代码的关键。
【解决方案2】:

在第二个版本中,a=1 最终会被执行即使condition 是假的,只是因为在不再满足循环条件后控制流最终到达done:。 p>

【讨论】:

  • @Werner:使用版本 1?不,说真的,这取决于你想要什么行为。如果您想要版本 1 的行为,请使用版本 1。如果您想要版本 1 的行为,但由于某种原因不能使用版本 1,请告诉我们原因,以便我们提出替代方案。最简单的解决方案是将a=1 移回条件内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2011-07-23
  • 2011-04-17
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多