有时我需要在C / C ++中编写一个循环,其中有一个初始化后跟一个条件。
我喜欢这个样子,
for (int i = 0, j = 0; i == 0 && j == 0;) {
// condition fails at some point
}
超过这个。
int i = 0, j = 0;
while (i == 0 && j == 0) {
// condition fails at some point
}
当然这是个人代码所以没有人可以评判我。编译器是否会使它们成为同一个东西?
答案 0 :(得分:7)
如果您在循环后不需要变量for
和i
,请使用j
循环。
如果您在循环后需要变量while
和i
,请使用j
循环。
答案 1 :(得分:1)
这既不好也不坏。
正如BLUEPIXY的评论和R Sahu的回答所指出的那样,变量的范围是不同的。 while
表单允许在循环后使用变量i
和j
,而for
表单则不会(尽管可以通过声明变量来轻松更改) for
语句之前的变量。
只有您可以决定在循环后是否需要访问变量i
和/或j
。但是,根据经验,我建议不要在循环之后访问它们,除非有特殊需要(即尽可能地限制它们的范围)。
如果此代码属于它自己的函数,并且函数在循环之后立即返回,那么如果函数的返回值取决于i
或j
,则只有差异。
您可能希望仔细研究如何在循环体中更新变量i
和j
,并考虑是否可以将该逻辑移入for
语句本身。取决于环体的复杂性,这可能是也可能是不可能的。这可以帮助读者更清楚地了解循环实际更新这些变量的条件。并且考虑是否在循环体外部移动更新将迫使您考虑循环体本身是否可以以更简单的方式编写(给出在两种实现相同结果的方式之间的选择,总是更喜欢更简单的方法,因为它更容易理解,更容易纠正,以及将来更容易维护。
假设您有一个取决于两个变量值的循环,请考虑是否可以使用嵌套循环(一个在i
上工作,一个在j
上工作)。
答案 2 :(得分:1)
如果你不使用for
循环中的第三个子句(对于递增/递减/无论如何),你就不会为此付费。
编译器完全能够在两种情况下生成相同的代码,因此您的for
代码是有效的,甚至可能由于其他人的范围参数而更可取。
实际上C ++标准explicitly requires这两个选项是等价的,所以它甚至不是编译器的选择问题。