如何将这个 While 循环写成 For 循环?

3
我正在按照本网站推荐的方法阅读《C++ Primer第5版》。我正在学习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循环由initstatement、condition和expression组成。在while循环中,“std::cin>>value”是我的condition,而没有expression。那么如果我只有一个initstatement和一个condition,我该如何使用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 表达式的任何部分都可以为空。 - Some programmer dude
旁注:在编程中,当我们知道迭代次数时,我们使用for循环进行练习,而当我们希望在特定条件下中断时,我们更喜欢使用while。 - Grijesh Chauhan
3
@Grijesh: 不,for循环是指在每次循环中都需要“初始化”,“条件”和“更新”步骤。例如,可以使用for(T *p = head; p; p=p->next) ...迭代链表--我们不知道计数的数量,只知道到达零时结束。将数字分解为其数字可以使用for(int x = n; x; x /= 10) ...完成,等等。 - Mats Petersson
如果你想知道为什么提供的示例不能正常工作:return 0;在while循环内部。带有明显错误的示例?不太好。 - Jongware
4个回答

4

如果你将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)”格式。谢谢! - Bit Deception
你是,但其中任何一个部分都可以为空。for(;;) 是编写“永远”循环的常见方式,直到循环内的某些内容调用 breakreturnthrow 才会终止。 - user229044
1
我的意思是我以为我必须使用所有三个部分。这本书没有明确说明我是否可以省略某些部分。现在我明白了。 - Bit Deception

1
重要的是,您可以忽略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");
}

1
一个 while 循环作为 for。
{
  int i = 0;
  while( i < limit){
         //do stuff
         i++;
   }
}

保留作用域运算符以处理循环结束时的迭代变量。

0
有时候,使用一种方式比另一种方式更加简洁明了。考虑以下两种情况;
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
}

尽管有人说“当你知道迭代次数时使用for”,但我偏好选项2。我想这适用于一般规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接