【问题标题】:Can all for-loops be converted to while-loops?可以将所有 for 循环都转换为 while 循环吗?
【发布时间】:2014-04-29 08:48:30
【问题描述】:

在下面的示例中,使用从 for 循环到 while 循环的转换,// fixed block 可以是任何有效的代码块,前提是您可以在 while 循环之前或之后添加任何其他代码块?

for (int i = 0; i < 10; i++) {
    // fixed block
}


int i = 0;
while (i < 10) {
    // any block
    // fixed block
    // any block
}

为了表明答案可能不是简单的“是”,我想到了一个可能是反例的代码块:

for (int i = 0; i < 10; i++) {
    i = i * 2;
    if (1 < 2) {
        print(i);
        continue;
    }
}

if 语句在那里,因此在 while 循环中,您可以在 continue; 语句之后添加一段代码,而不会出现可能的编译器错误/警告。 for循环的输出是0、2、6和14。在while循环的固定代码块之前或之后添加i++;都不起作用,说明答案可能并不简单。

【问题讨论】:

  • @PaulG:你在说什么? for (int i = 0; i &lt; 0; i++);.
  • 你的问题已经演变成一个全新的问题,不再清晰。
  • 进化成全新的?问题没有改变。我可以理解这个问题可能不清楚,但很抱歉,我想不出更好的方式来呈现它。是的,我确实在帖子末尾提出了两个问题,但第一个问题只是引出了原始问题。我担心如果我不举例子问这个问题,人们会盲目地回答“是”。提出的反例的重点是表明答案并非微不足道。我认为这个例子让人们无法直接解决这个问题,但我也认为排除它会更糟。

标签: loops for-loop while-loop continue


【解决方案1】:

当然可以,只需设置类似的退出条件即可。我不认为相反的(while 循环转换为 for 循环)是正确的。

另外,是的,你的代码块在这两种情况下的功能都是一样的,如果代码是有效的(逻辑上和句法上),那么它会起作用。

【讨论】:

  • while 循环比其他方式更容易变成for 循环。 while(whatever){do_thing();} -> for(;whatever;){do_thing();}。您甚至不需要引入额外的范围或重命名变量来规避范围问题。
  • 当然这很容易,但这取决于条件的来源。使用for 循环,您几乎总是至少有一次迭代,但使用while 循环可能并非如此,具体取决于条件。 for 循环被构建为至少运行一次迭代,因为您在一个地方声明了变量、条件和迭代器(否则为什么要使用它们?)。所以如果问题是“所有的while循环都可以转换成for循环吗?”我会说不,不是“全部”。
  • 我不确定你写的是哪种for 循环。你肯定已经对一个空数组进行了 for 循环,不是吗?
  • @user2357112 确实,我确实有,而且我更喜欢foreach 或类似的集合。我的意思是,如果这个问题被颠倒过来,我不会回答是,我认为它不会在“所有情况下”起作用。
猜你喜欢
  • 2018-02-22
  • 2017-04-26
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多