while循环需要显式条件,for循环没有,为什么?

时间:2014-02-11 20:57:05

标签: c++ loops syntax

在C ++中,允许在for循环中有一个空条件,例如在for (;;)for (int x = 0;; ++x)中。但你无法做while ()

当在for循环中省略条件时,假定条件为true(因此循环永远循环)。为什么这不是while循环的情况,也就是说,不让while ()成为while (true)的别名背后的论点是什么?

6 个答案:

答案 0 :(得分:30)

据推测,for-statement中的每个给定子句都是可选的,这是一个副作用。这就是为什么一些for循环不需要赋值的原因;这就是为什么有些人不需要条件的原因;这就是为什么还有其他人不需要增量的原因。要求最少数量的这些将是不必要的复杂性。

答案 1 :(得分:8)

以下内容来自 Deep C Secrets

早期C没有单独的运营商和&和&&或者和||。 (得到了吗?)相反,它使用了“真值背景”的概念(继承自B和BCPL):其中布尔值是预期的,在“if”和“while”等之后,&和|运营商被解释为&&和||现在;在普通表达式中,使用了按位解释。它运作得很好,但很难解释。 (在真值环境中存在“顶级运营商”的概念。)

所以你有它,while()会为真值设置上下文,并且如果()不能为空,则不能为空或隐含,早期语言的机制是预期的他们不是。

答案 2 :(得分:8)

  

在C ++中,你可以在for循环中有一个空条件......   不让while()成为while(true)的别名的背后的论点是什么?

首先,C ++(和C#以及许多其他语言)是它们与C向后兼容的方式,所以我们来谈谈C。

让我们做一些陈述并得出结论。

  1. for循环允许您省略条件的理由很充分。
  2. 同样的理由适用于while循环。
  3. while循环不允许省略条件;这是不一致的。
  4. 语句中设计选择的一致性是设计C的重要因素。
  5. 因此,必然存在不明确的原因;必须有一个很好的理由说明while循环与for循环不一致。
  6. 现在的问题是“那个不明显的理由是什么?”

    但是,如果上述逻辑链是正确的,那么这个问题才有意义。在这些陈述中,只有#3实际上是真的! C中的for循环设计很差;它是多余的,对新手来说很困惑,它的词汇约定与语言的其他部分不一致。它通过简单的while循环为语言提供几乎零的额外代表能力。

    你的问题没有答案; 正确的反应是完全拒绝这个问题的前提。 for循环似乎是合理的,因为它是我们大多数人长大的40多年的错误,所以它的怪癖现在是第二天性;这是熟悉,不是好设计。如果我们在没有for循环的情况下长大,我们就不会添加它。

答案 3 :(得分:3)

我认为主要区别在于表达式语句

当然,在C中,两者并没有严格区分,但我会说for循环是:

for (statement; expression; statement) {
    ...
}

表达式是一个布尔表达式,而语句是......具有副作用的语句。当然,C不是半功能的;你可以在中间表达中加入副作用,但这不是惯用的。

但有时你不想要一个表达式,但是在开始和每次循环迭代时的语句都是有用的,所以中间表达式是可选的:

// Infinite counter
int i;
for (i = 0;;i++) {
   ...
}

这个定义意味着表达式被认为是真的

另一方面,whileif只能 表达。如果你省略那个表达式,那么没有什么是非常有用的(与剩下的两个有用的语句不同):没有人会写

// Idiot coding
if (true) {
   ...
}

因为if语句的要点是检查某个未知是否为真!

while相同。只要表达式形式的条件为真,while就要反复做一些事情。它有点像“迭代if”。这就是为什么

while() {
   ...
}

不被视为合乎逻辑,因此不被允许。

答案 4 :(得分:1)

根据Document

6.8.5.3 for语句

  

陈述for ( clause-1 ; expression-2 ; expression-3 )   声明的行为如下:

     
      
  1. 表达式表达式-2是控制表达式   在每次执行循环体之前进行评估。表达方式   在每次执行后,expression-3被计算为void表达式   循环体。如果第1条是声明,则是任何范围   它声明的标识符是声明的剩余部分和   整个循环,包括其他两个表达式;达到了   在第一次评估控制之前的执行顺序   表达。如果clause-1是表达式,则将其计算为void   在控制的第一次评估之前的表达   expression.158)
  2.   
  3. 可以省略子句-1和表达式-3。 省略   expression-2被非零常量替换。
  4.   

因此,在for循环的情况下,条件将被非零常量替换,而while循环没有这样的实现。

答案 5 :(得分:-3)

while()和for(;;)循环中使用的逻辑语句之间的区别在于:

  • 如果语句定义退出循环的条件

  • 在while()的情况下,语句定义执行循环的条件

假设你看到要进入一个循环,你至少需要一个执行条件,而不是退出条件。