在C ++中,允许在for循环中有一个空条件,例如在for (;;)
或for (int x = 0;; ++x)
中。但你无法做while ()
。
当在for循环中省略条件时,假定条件为true
(因此循环永远循环)。为什么这不是while
循环的情况,也就是说,不让while ()
成为while (true)
的别名背后的论点是什么?
答案 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。
让我们做一些陈述并得出结论。
for
循环允许您省略条件的理由很充分。while
循环。while
循环不允许省略条件;这是不一致的。while
循环与for
循环不一致。现在的问题是“那个不明显的理由是什么?”
但是,如果上述逻辑链是正确的,那么这个问题才有意义。在这些陈述中,只有#3实际上是真的! C中的for
循环设计很差;它是多余的,对新手来说很困惑,它的词汇约定与语言的其他部分不一致。它通过简单的while
循环为语言提供几乎零的额外代表能力。
你的问题没有答案; 正确的反应是完全拒绝这个问题的前提。 for
循环似乎是合理的,因为它是我们大多数人长大的40多年的错误,所以它的怪癖现在是第二天性;这是熟悉,不是好设计。如果我们在没有for
循环的情况下长大,我们就不会添加它。
答案 3 :(得分:3)
我认为主要区别在于表达式和语句。
当然,在C中,两者并没有严格区分,但我会说for循环是:
for (statement; expression; statement) {
...
}
表达式是一个布尔表达式,而语句是......具有副作用的语句。当然,C不是半功能的;你可以在中间表达中加入副作用,但这不是惯用的。
但有时你不想要一个表达式,但是在开始和每次循环迭代时的语句都是有用的,所以中间表达式是可选的:
// Infinite counter
int i;
for (i = 0;;i++) {
...
}
这个定义意味着表达式被认为是真的
另一方面,while
和if
只能 表达。如果你省略那个表达式,那么没有什么是非常有用的(与剩下的两个有用的语句不同):没有人会写
// Idiot coding
if (true) {
...
}
因为if
语句的要点是检查某个未知是否为真!
与while
相同。只要表达式形式的条件为真,while
就要反复做一些事情。它有点像“迭代if
”。这就是为什么
while() {
...
}
不被视为合乎逻辑,因此不被允许。
答案 4 :(得分:1)
根据Document:
6.8.5.3 for语句
陈述
for ( clause-1 ; expression-2 ; expression-3 )
声明的行为如下:
- 表达式表达式-2是控制表达式 在每次执行循环体之前进行评估。表达方式 在每次执行后,expression-3被计算为void表达式 循环体。如果第1条是声明,则是任何范围 它声明的标识符是声明的剩余部分和 整个循环,包括其他两个表达式;达到了 在第一次评估控制之前的执行顺序 表达。如果clause-1是表达式,则将其计算为void 在控制的第一次评估之前的表达 expression.158)
- 可以省略子句-1和表达式-3。 省略 expression-2被非零常量替换。
醇>
因此,在for
循环的情况下,条件将被非零常量替换,而while
循环没有这样的实现。
答案 5 :(得分:-3)
while()和for(;;)循环中使用的逻辑语句之间的区别在于:
如果语句定义退出循环的条件
在while()的情况下,语句定义执行循环的条件
假设你看到要进入一个循环,你至少需要一个执行条件,而不是退出条件。