【问题标题】:Why is a for loop's condition optional, but a while loop's isn't? [duplicate]为什么 for 循环的条件是可选的,而 while 循环的条件不是? [复制]
【发布时间】:2019-01-04 13:45:16
【问题描述】:

为什么for(;;) 被视为无限循环,而while() 由于需要表达式而给出错误?为什么for 循环也不期望表达式?

【问题讨论】:

标签: c++ c loops for-loop while-loop


【解决方案1】:

只是……没有。

while 可以允许一个空条件(大概会被解释为true),但它会与if 不对称,这对它来说意义不大。

最终,没有令人信服的理由允许 while 序言中的空条件,因为任何使用它的代码都不会自我记录。

为了与for 对称,您可以要求for(; true; ) — 只是现在这看起来很奇怪,因为声明和更新子句现在可能为空,而条件则不能。好的,让我们也强制执行这些。那么,我们在那些地方放什么来做空操作呢? for (int dummy = 0; true; (void)dummy)?现在越来越傻了。

它们是不同的语言特性,没有充分的理由让它们在这方面以相同的方式工作而牺牲其他考虑。

【讨论】:

  • 很好的解释。注意:“更准确地说,为什么 for 循环不需要表达式[?]” --> eel.is/c++draft/stmt.for#2 我猜
【解决方案2】:

免责声明:这个答案解释了为什么语法是有效的,而不是为什么它是这样设计的。

根据documentation(强调我的):

正式语法:

attr(optional) for (init-statement condition(optional) ; iteration_expression(optional) ) 语句

所以只需要init-statement;。对于init-statement,它说:

一个表达式语句(可能是一个空语句“;”

因此,如果你放弃可选的东西并为 init 语句添加一个;,你得到的只是;;

C 中有点不同:

for (init_clause ; cond_expression ; iteration_expression ) 循环语句

init_clause、cond_expression 和 iteration_expression 都是可选的

这是两个; 和三个可选子句/表达式。如果你省略这三个,你会再次得到;;

【讨论】:

  • 我认为问题是为什么(虽然我并不是说我回答这个问题的尝试很棒)
  • 你是对的。这里有些模棱两可。可以解释为“为什么会这样”或“规则为什么会这样定义”。
  • 看,我会将这两个语句解释为相同的:P 因为 OP 已经发现该语言允许一种语言而不是另一种语言,并且用标准语言重申这一观察并不能真正增加我们的理解:)
  • 确实如此。我解释它的方式,我认为 OP 想知道是否存在一些语法技巧,允许省略 for 中的语句,但在 while 中不起作用。无论如何,我很欣赏你对 OP 问题的回答,我从来没有想过这么多,但现在我知道了。 :)
【解决方案3】:

这是一个语言设计问题,所以语言设计师应该加入。 我的意见:一种语言的可选特性(特别是快捷方式)应该 防止错误。 因此,while() 很容易出错(您省略了条件,例如 0 或 1),而 for(;;) 很少出错(你必须有意识地输入 2 ;)。

【讨论】:

  • 嗯,是的,这是不用担心不对称的好理由?
  • 这样的答案正是为什么这个问题主要是基于意见的,应该这样结束。这个答案表达了一个有效的观点和一个合理的解释,但它仍然只是一个观点。
  • @JohnBollinger 我认为我们倾向于允许“为什么 X 以这种方式设计”,因为原因通常可以从当代资料或语言设计者的报告中客观地确定我们可能没有考虑到的实际原因。选择本身可能是主观的,但我们通常可以客观地报告这些理由。 (这与在销售点是主观的代码风格类型问题形成对比,这就是规则旨在消除的问题。)虽然在这种情况下,我不确定基本原理,如果真的存在的话,是否可以发现.
  • @Lightness,我可以提供一个答案,提供 Kernighan 和 Ritchie 对此设计选择的实际理由,或者甚至是对当时的语言设计的分析,从而产生关于这种设计的第三方结论理由。但是这个特定的问题似乎不太可能产生这样的答案,而我们正处于“主要基于意见”的密切原因本应阻止的情况。
  • @JohnBollinger 好吧,你不知道,直到你问;)我已经看到很多这样的问题都可以得到这样的答案。否则,“我们不知道”是一个有效的答案。我仍然认为这会使问题本身成为话题,因为它本身并不是就主观问题征求建议或意见。
猜你喜欢
  • 2011-04-21
  • 2014-12-26
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 2022-01-13
  • 2018-06-26
相关资源
最近更新 更多