相关疑难解决方法(0)

GOTO仍被视为有害吗?

每个人都知道Dijkstra 给编辑信件:转到被认为有害的声明(也就是这里 .html脚本和这里的 .pdf)并且从那时起就有一个强大的推动,尽可能避开goto声明.虽然可以使用goto来生成不可维护的,庞大的代码,但它仍然保留在现代编程语言中.甚至Scheme中的高级连续控制结构也可以被描述为复杂的goto.

什么情况下可以使用goto?什么时候最好避免?

作为后续问题:C提供了一对函数setjmp和longjmp,它们不仅可以在当前堆栈帧内,而且可以在任何调用帧中进行转换.这些应该被视为像goto一样危险吗?更危险吗?


Dijkstra本人对这个头衔表示遗憾,他对此不负责任.在EWD1308(也是这里 .pdf)结束时,他写道:

最后是一个短篇小说的记录.1968年,ACM的通讯以" 被认为有害的goto声明 "的标题发表了我的一篇文章,遗憾的是,在后来的几年中,这一期刊最常被引用,但是,经常被作者看到的不多于标题,通过成为一个模板成为我的名声的基石:我们会看到几乎任何X的标题"X被认为有害"的各种文章,包括一个标题为"Dijkstra被认为有害"的文章.但是发生了什么?我提交了一份题为" 反对goto声明的案件 "的论文"为了加快出版速度,编辑已经变成了一封"给编辑的信",并在此过程中给了他一个新的自己的发明名称!编辑是Niklaus Wirth.

关于这个主题的经过深思熟虑的经典论文,与Dijkstra的相关,是结构化编程,由Donald E. Knuth撰写.阅读都有助于重新建立背景和对主题的非教条性理解.在本文中,Dijkstra对此案的观点得到了报道,甚至更为强烈:

Donald E. Knuth:我相信通过提出这样一种观点,我实际上并不同意Dijkstra的观点,因为他最近写了以下内容:"请不要陷入相信我非常悲惨的陷阱.去发言.我有其他人正在一个宗教出来的不舒服的感觉,就好像编程的概念问题可以通过一个单一的技巧来解决,通过编码规则的简单形式! "

language-agnostic goto

273
推荐指数
27
解决办法
7万
查看次数

什么是更好的方法来避免do-while(0); hack in C++?

当代码流是这样的:

if(check())
{
  ...
  ...
  if(check())
  {
    ...
    ...
    if(check())
    {
      ...
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我一般都看到这个工作,以避免上面的凌乱的代码流:

do {
    if(!check()) break;
    ...
    ...
    if(!check()) break;
    ...
    ...
    if(!check()) break;
    ...
    ...
} while(0);
Run Code Online (Sandbox Code Playgroud)

有哪些更好的方法可以避免这种解决方案/黑客攻击,从而使其成为更高级别(行业级别)的代码?

任何开箱即用的建议都是受欢迎的!

c++ do-while

232
推荐指数
17
解决办法
2万
查看次数

C或C++中良好的getos的例子

在这个主题中,我们看一下gotoC或C++ 的良好用法示例.它的灵感来自人们投票的答案,因为他们认为我在开玩笑.

摘要(标签从原始标签更改为使意图更清晰):

infinite_loop:

    // code goes here

goto infinite_loop;
Run Code Online (Sandbox Code Playgroud)

为什么它比替代品更好:

  • 这是具体的. goto是导致无条件分支的语言构造.替代方案取决于使用支持条件分支的结构,具有退化的始终为真的条件.
  • 标签记录了意图,没有额外的评论.
  • 读者不必扫描早期介入代码breakS(尽管它仍然可能无原则黑客模拟 continue与早期goto).

规则:

  • 假装gotophobes没有赢.据了解,上述内容不能用于实际代码中,因为它违背了既定惯用语.
  • 假设我们都听说'Goto被认为有害',并且知道goto可以用来写意大利面条代码.
  • 如果你不同意一个例子,那就单独批评技术优点('因为人们不喜欢goto'不是技术原因).

让我们看看我们是否可以像成年人一样谈论这个问题.

编辑

这个问题现在好了.它产生了一些高质量的答案.感谢大家,尤其是那些认真对待我的小循环示例的人.大多数怀疑论者都担心缺乏范围.正如@quinmars在评论中指出的那样,你总是可以在循环体上放置大括号.我顺便注意到for(;;)并且while(true)也没有给你免费的大括号(并且省略它们会导致烦恼的错误).无论如何,我不会浪费任何更多的脑力这个小事-我可以用无害的习惯生活for(;;)while(true)(一样好,如果我想继续我的工作).

考虑到其他反应,我发现许多人认为goto你总是需要以另一种方式重写.当然,你可以goto通过引入一个循环,一个额外的标志,一堆嵌套的ifs或其他什么来避免,但为什么不考虑是否goto可能是这项工作的最佳工具?换句话说,人们准备忍受多少丑陋以避免使用内置语言功能达到预期目的?我的看法是,即使添加一面旗帜,也要付出太高的代价.我喜欢我的变量来表示问题或解决方案域中的事物.'唯一要避免goto'不削减它.

我会接受第一个给出C模式分支到清理块的答案.国际海事组织,这是goto所有已发布答案的最强情况,当然,如果你通过一个仇恨必须通过避免它的扭曲来衡量它.

c c++ goto

79
推荐指数
11
解决办法
15万
查看次数

我们如何像其他语言(c ++和Java)一样处理c中的错误和异常?

我们如何处理像C异常和错误在C++中,我们使用Java try {}catch{}?C有什么办法吗?

c error-handling exception-handling

9
推荐指数
2
解决办法
1261
查看次数

C/C++条件返回语句

我正在研究嵌入式程序,在某些情况下如果没有条件,我想尽快从函数返回.如果我有以下代码,我正在进行嵌入式编程:

foo() {
   if (a < b) {
       return 0;  // bail, since condition is met
   } else {
       // lots of calculations in this block
   }
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,有多个return语句是不是很糟糕?这是不好的做法吗?有更好的方法吗?MISRA是否对此有所说明?

注意:这个问题特别针对嵌入式系统,与MISRA有关,而不仅仅是C/C++

谢谢...

c c++ misra

8
推荐指数
2
解决办法
8328
查看次数