【问题标题】:Pascal's repeat... until vs. C's do... while帕斯卡的重复......直到与 C 的做......而
【发布时间】:2026-01-02 13:00:01
【问题描述】:

在 C 中有一个 do while 循环,pascal 的(几乎)等价的循环是重复直到循环,但两者之间有一个小的区别,而两个结构将至少迭代一次并检查它们是否需要执行循环再次仅在最后,在帕斯卡中,您在 C 中编写终止循环所需满足的条件(REPEAT UNTIL 某事),您编写继续循环所需满足的条件(DO WHILE 某事)。有这种差异的原因还是只是一个武断的决定?

【问题讨论】:

  • Hellfreezeover := false;重复直到 Hellfreezeover

标签: c syntax loops pascal


【解决方案1】:

根本没有区别,也没有优势。它只是“语法糖”——对语言语法的更改不会以任何实际方式改变其行为。有些人发现“重复直到”更容易概念化,而另一些人则发现“重复时”更容易。

如果在 C 语言中,你遇到了“直到”是你想要的情况,你总是可以直接否定条件:

do {
    excitingThings();
} while ( !endOfTheWorld() );

【讨论】:

  • 至少,我们都做一件令人兴奋的事情:D
【解决方案2】:

在 C 中声明

 while(some_condition);

可能是一个“什么都不做”循环,或者可能已经脱离了一个“do ... while”循环。

 do {
  statement;
  statement;
  statement;
  lots more statements;
 }

 while(some_condition);

使用不同的关键字 - 直到 - 避免这种可能的误解。

如今,当每个人都打开所有编译器警告并注意它们时,这不是这样的问题,不是吗? 不过,我怀疑大多数资深 C 程序员都希望——在某个时候或其他时间——C 在这种情况下使用“直到”。

【讨论】:

  • 我使用while (cond) continue;来明确循环体是空的。
  • @Loadmaster - 好主意 - 我可能会在自己的代码中采用那个。
  • @ChrisHarris:是的,循环体的空语句(裸分号)是一个等待发生的错误。错误的代码风格。
【解决方案3】:

我不确定历史影响,但我认为 C 更一致,因为 ifs 需要条件为 true 才能运行代码,就像这样做一样whiles 和 do whiles。

【讨论】:

    【解决方案4】:

    Pascal 的设计部​​分受到 1960 年代结构化编程工作的推动,包括 Edsger Dijkstra 的开创性工作A Discipline of Programming。 Dijkstra(认为goto 有害的同一个人)发明了创建通过构造正确的程序的方法。这些方法包括编写循环的方法,这些循环关注循环终止时建立的后置条件。在创建 repeat... until 表单时,Wirth 受到 Dijkstra 的启发,使终止条件而不是其补码在代码中明确。

    我一直很欣赏像 Smalltalk 和 Icon 这样的语言,它们提供了两种句法形式,因此程序员可以清楚地表达他或她的意图,而不必依赖容易错过的补码运算符。 (在 Icon 中,表单是 while e1 do e2until e1 do e2;在 Smalltalk 中,它们是 block1 whileTrue: block2block1 whileFalse: block2。)在我看来,C 和 Pascal 都不是完全构建的正交设计。

    【讨论】:

    • 所以以 perl 为例,它甚至具有 if 的补充,即 unless,您可以将它们放在语句之前或之后。但是 perl 的正交性并不是真正的优势。
    • +1,在语言中提供这两种形式可以让代码更具可读性。
    【解决方案5】:

    这只是一个武断的决定。有些语言两者兼而有之。 QBASIC/VB DO...LOOP 语句支持 pretest/posttest 和 WHILE/UNTIL 的所有四种组合。

    【讨论】:

      【解决方案6】:

      没有任何“决定”可以以任何方式将 Pascal 重复/直到循环的行为与 C 的 do/while 循环的行为联系起来,既不是故意的也不是任意的。这只是两个完全不相关的问题。

      【讨论】:

        【解决方案7】:

        只是一些信息。

        路跑者:while(not edge) { run(); }

        Wily E Coyote:do { run(); } while(not edge);

        【讨论】:

          【解决方案8】:

          我总是发现 UNTIL 循环向后,但这可能只是因为我来自 C 背景。有像 Perl 这样的现代语言可以同时提供这两种语言,但其中一种语言并没有什么特别的优势

          【讨论】:

          • 我个人也觉得C版本更有意义,而且我是帕斯卡出身,所以一开始学C就发现自己用C写错了条件。
          【解决方案9】:

          C 语法不需要额外的关键字。

          在 C 中,dowhile 这两个关键字适用于两种循环。 Pascal 需要四个关键字:whiledorepeatuntil

          【讨论】:

          • 您只需要多出 1 个关键字。 while 用于前置条件,repeatdountil 用于后置条件
          • 另一方面,C 循环使用关键字,可能会导致混淆。查看 ChrisHarris 的帖子