如何使用带有中断的
do
呢?实际上这是一种巧妙的方式来实现
goto
,你可以将其视为由多个
if
语句组成的过滤器,其中如果没有任何一个
if
语句被触发,则默认执行最后一部分。
parameters: a, b
do {
if (a > 5)
{
Print("Very well, a > 5");
if (b > 7)
{
Print("Even better, b > 7");
break;
}
}
Print("I don't like your variables");
} while (false);
英译中:
编辑 - 关于语言的再利用
许多人反对使用 do while 来解决特定问题的专业用法。主要反对意见似乎是它看起来像一个循环,但实际上并不是一个循环,因此这种构造落入了循环使用的一种怪异谷。换句话说,“这不自然。”
我同意这是一种不常见的用法,确实应该有注释来说明这是一个使用 do while 进行过滤的块,允许在达到决策树分支终点时使用 break 语句。这就是它的真正作用,一个由一系列决策组成的硬编码前向遍历决策树,没有回溯。在决策过程的任何时刻,我们都可以做出决策或者按照默认决策继续执行,包括表示没有任何决策。
可以说,任何需要注释才能理解的源代码都不是好的代码。另一方面,几乎所有编程语言都有一些插入注释的方式,因为在六个月后回来进行更改时,注释源代码非常有帮助。
这种方法的好处在于它创建了一个本地作用域,因此决策过程中需要的变量可以正确地构建和销毁。
在某些方面,它有点像 lambda,我想没有人会反对它,它可以在不支持 lambda 的语言中使用。在另一方面,它有点类似于 try catch。
在网上浏览时,可以找到很多文章,其中有人以与原始设计意图不同的方式使用编程语言,例如这篇关于
使用函数式编程风格的 C++的文章或这本关于
使用面向对象实践的 C 语言的在线书籍。
所有程序员都有一定的编码风格或语言使用习惯。从源代码审查和阅读他人的源代码中学习使用编程语言的不同方式是一件好事。
这不是像
混淆C编程竞赛的入口那样棘手的代码。它非常直接。
编辑:比goto更好吗?
对于这种不寻常的do-while使用,有一个问题,“为什么不只使用goto?”阅读
Dijkstra的论文“考虑到有害的Go To语句”以及这个
关于论文和goto语句的博客讨论, 我们可以看到,使用带有break语句的循环具有几个良好的特性,而这些特性不是goto及其相关标签的特性。
主要特点,特别是在这个例子中,是单向流动,有明确的开始和结束。移动goto标签不会意外改变程序流程。在函数的其他地方使用goto标签作为跳转的机会,从而创建了原本没有意图的依赖关系,也不存在危险。阅读代码,每个程序员都知道,在break处离开循环,并在离开循环后进入循环关闭后的源代码行。结果是你拥有一个漂亮干净的知识块,可以标记为“弄清楚要打印的文本”。