3

我正在阅读本网站推荐的“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”是我的条件,没有表达式。那么我应该如何使用如果我只有一个 initstatement 和一个条件,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");
}
4

4 回答 4

4

错误,您可以通过替换为...将任何while循环编写为循环forwhile(...)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语义上更正确的循环。

于 2013-07-24T17:59:40.900 回答
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");
}
于 2013-07-24T18:01:32.610 回答
1

一个while循环作为一个for

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

当循环完成时,保持范围运算符丢弃迭代变量。

于 2013-07-24T18:48:53.023 回答
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
}

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

于 2013-07-24T22:27:04.197 回答