【问题标题】:How to Write this While Loop as a For Loop?如何将此 While 循环编写为 For 循环?
【发布时间】:2013-07-24 08:47:50
【问题描述】:

我正在阅读本网站推荐的“C++ Primer 5th Edition”。我正在逐步执行 For 和 While 循环,并得出结论它们实际上是相同的。至少这是我收集到的。我认为当有人说“For 循环适用于您知道要循环多少次时,而 while 循环适用于您想要循环直到满足条件时”,我认为他们解释得最好。但本质上,编译器并没有区分两者,它们可以互换使用。

这本书展示了这段代码(它甚至没有按照解释的方式工作):

<iostream>

int main()
{

int sum = 0, value = 0;
// read until end-of-file, calculating a running total of all values read

while (std::cin >> value)   {
sum += value; // equivalent to sum = sum + value
std::cout << "Sum is: " << sum << std::endl;
return 0;

    }
}

附加的练习说“编写你自己的程序版本,打印总和 从 cin 读取的一组整数。”我假设他们希望我使用 For 循环。所以我尝试这样做。不过我很难。

书上说“For循环由初始化语句、条件和表达式组成。在while循环中,“std::cin >> value”是我的条件,没有表达式。所以我该怎么办如果我只有一个初始化语句和一个条件,那么使用 for 循环?

#include <iostream>


int main()

{
int sum = 0;

for (int value = 0; std::cin >> value; "EXPRESSION GOES HERE")
    sum += value;
std::cout << "The sum is: " << sum << std::endl;
return system("pause");
}

【问题讨论】:

  • 请记住,for 表达式的 any 部分可以为空。
  • 旁注:当我们知道迭代次数时,我们使用for循环,而我们更喜欢在特定条件下中断
  • @Grijesh:不,for 循环是您在每个循环中都需要的“初始化”、“条件”和“更新”步骤。例如。一个链表可以用for(T *p = head; p; p = p-&gt;next) ... 进行迭代——我们不知道有多少,只是当它达到零时就完成了。将一个数字除以得到它的位数可以是for(int x = n; x; x /= 10) ...等。
  • 如果您想知道为什么提供的示例不起作用(正确):return 0; 在 while 循环内。有明显错误的例子?不是很好。

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


【解决方案1】:

有时代码看起来更整洁,而不是另一个。考虑两种情况;

std::vector<double> myVector;
typedef std::vector<double>::iterator dblIter;
dblIter curr = myVector.begin();
dblIter end = myVector.end();

while(curr != end)
{
    // do stuff
    ++curr;
}

或者;

std::vector<double> myVector;
typedef std::vector<double>::iterator dblIter;

for(dblIter curr = myVector.begin(); curr != myVector.end(); ++curr)
{
    // do stuff
}

我碰巧更喜欢选项 2,尽管 cmets 说“当您知道迭代次数时使用”。我想它作为一般规则适用。

【讨论】:

    【解决方案2】:

    一个while循环作为一个for

    {
      int i = 0;
      while( i < limit){
             //do stuff
             i++;
       }
    }
    

    让作用域运算符在循环完成后丢弃迭代变量。

    【讨论】:

      【解决方案3】:

      错误,您可以将任何while 循环编写为for 循环,方法是将while(...) 替换为for(;...;)...

      for (;std::cin >> value;)   {
      
      }
      

      您发布的代码中没有任何内容表明for 循环。通常,当您真正想要计算某些内容或迭代集合时,您将使用 for 循环。你的意图只是循环直到满足一个条件,所以几乎尖叫while,而不是for

      我想如果我必须用 for 循环“正确”地写这个,我可能会使用这样的东西:

      int sum = 0;
      for (int i = 0; std::cin >> i; sum += i); // empty loop body
      std::cout << sum << std::endl;
      

      不过,我更有可能使用语义上更正确的while 循环。

      【讨论】:

      • 哦,好的。我以为我仅限于使用“for (initstatement, condition, expression)”格式。谢谢!
      • 你是,但是这三个部分中的任何一个都可以是空的。 for(;;) 是编写“永远”循环的常用方法,该循环永远不会终止,直到循环中的某些内容调用 breakreturnthrow
      • 我的意思是我认为我必须使用所有三个部分。这本书没有具体说明我是否可以省略部分内容。现在我明白了。
      【解决方案4】:

      答案的重要一点是你可以把 for 表达式的每一部分都去掉,例如

      for (;;) break;
      

      将是有效的代码。

      另外我建议把一本 C++ 书放在一边,在这种情况下回到 C,因为循环语义基础对于两者来说是相同的,而 C 则要简单得多。

      编辑:您的问题的完整解决方案可能类似于:

      #include <iostream>
      
      
      int main()
      
      {
      int sum = 0;
      
      for (int value = 0; std::cin >> value; sum+= value); 
      
      // alternative version, a bit easier to read probably:
      // for (int value = 0; std::cin >> value;) sum+= value;
      
      std::cout << "The sum is: " << sum << std::endl;
      return system("pause");
      }
      

      【讨论】:

        猜你喜欢
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        相关资源
        最近更新 更多