【问题标题】:Is it common practice to "abuse" loops as goto [closed]将循环“滥用”为 goto 是常见的做法吗?
【发布时间】:2016-09-19 11:49:35
【问题描述】:

如果代码中有很多 if 子句,并且代码的执行对先前的错误不合理,那么可以为此使用单周期循环吗?仅仅是为了能够休息一下就退出街区? 像这样:

do {
    //..code
    if (error1) break;
    //..code
    if (errorN) break;
    //do finally something when no errors before
} while (false);

【问题讨论】:

  • 这很常见。
  • 理论上(并且取决于周围的变量)您也可以将其包装在一个函数中并“返回”而不是中断。但是这种仍然会导致相同的结果:离开范围。
  • @stefaanv 确实!将关闭此,谢谢!
  • 这是常见的做法,但为了最大的可移植性,结束条件应该写成while (0);

标签: c++ c coding-style


【解决方案1】:

是的,这是惯用的,即使它可能不是 do while 循环的预期用途。 linux内核的源代码利用了这一点。

没有什么不清楚的:while(false) 完全按照罐头上的说明行事。

【讨论】:

  • 感谢您提到linux内核!
  • 这种技术比检查! error 并在if 块内执行代码有什么优势?
  • 那么,你必须在范围内有一个合适的error,而if 没有break
  • @Thomas 如果有多个地方需要检查错误,那么您需要复制您在if 块中放置的代码。通常,单入口单出口方法在 C 中更简单,并且允许合并清理代码。
  • @ThomasWilmotte 当您必须进行大量此类检查时,所有嵌套的缩进级别都很麻烦并且会损害可读性。您要么必须水平滚动(糟糕),要么比其他方式更早地换行。 (另见stackoverflow.com/a/18507973/179715
【解决方案2】:

是的,这是一种避免深度嵌套的常用技术,实际上比 goto; 更可取。

从可读性的角度来看,它比goto 语句更好。循环的作用域和代码流已经定义好了,不用去查找goto语句对应的标签,下面不一定会出现。

【讨论】:

  • 为什么首选 goto?效果不完全一样吗?
  • @tobi303 保证范围,可读性更好。使用goto 语句,您必须查找相应的标签(不一定出现在语句下方)。
  • @tobi303 提到(完全合法的)关键字goto 总是有引发宗教战争的风险。这只是进入人类思想的那些具有感染力的教条之一。
  • “循环的范围和代码流定义良好” 就像goto一样,至少在C++中是这样; to believe otherwise is to buy into a common misconception.
  • 我不同意可取性。 goto error/goto failure/goto cleanup 比简单的 break 声明更清楚地记录了意图。 IMO 过度缩进(由于无偿的do-while 块而发生)也会损害可读性。至于必须寻找goto 标签,这是一个苹果与橘子的比较。问题的上下文是关于 goto 可以与中断循环互换的情况。最后,如果您已经在循环或switch 语句中,则不能直接使用break 方法。
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多