【问题标题】:For loop and while loop comparisonfor循环和while循环比较
【发布时间】:2022-01-10 16:43:32
【问题描述】:

所以我做了下一个练习,只使用while 循环:

编写一个程序,提示用户输入两个整数。 打印这两个整数指定范围内的每个数字。

代码如下:

#include <iostream>

int main()
{
    std::cout << "Write two numbers: " << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "The numbers between " << v1 << " and " << v2 << " are: " << std::endl;

    while (v2 < v1 && ++v2 < v1)
    {
        std::cout << v2 << std::endl;
    }

    while (v1 < v2 && ++v1 < v2)
    {
        std::cout << v1 << std::endl;
    }

}

现在我必须使用 for 循环来完成,我这样做了:

#include <iostream>

int main()
{
    std::cout << "Write two numbers: " << std::endl;
    int a, b;
    std::cin >> a >> b;
    std::cout << "The numbers between " << a << " and " << b << " are: " << std::endl;

    for (; a < b && ++a < b; a)
    {
        std::cout << a << std::endl;
    }
    
    for (; b < a && ++b < a; b)
    {
        std::cout << b << std::endl;
    }
}

看起来几乎一样,但确实有效。

我的问题是:我错过了有关 for 循环的一些内容,我可以做得更简单吗?

PD:只是for循环,我还没在If章节,我想一步一步去“C++ Primer 5th edition”。

【问题讨论】:

  • 问题不清楚。有什么问题?
  • 没有问题,只是问是否有一种方法可以让 for 循环更简单,我问这个是因为 while 和 for 看起来非常相似。
  • for 循环中的第三个表达式为 for (; a
  • for (; a &lt; b &amp;&amp; ++a &lt; b; a) 这是一个很奇怪的模式,也许你更想要这个:for (; a &lt; b; a++)?
  • for 循环的所有三个部分都是可选的,因此如果您不需要“增量”部分,您可以像初始化部分一样跳过它,例如 for (; a &lt; b &amp;&amp; ++a &lt; b; )

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


【解决方案1】:

for 是根据while 指定的,您没有遗漏任何内容。

for (init-statement 条件opt; 迭代表达式opt) 语句

产生的代码相当于:

{ 初始化语句 while (条件) { 语句 迭代表达式; } }

除此之外

  1. init-statement 声明的名称(如果 init-statement 是一个声明)和 condition 声明的名称(如果 条件是 声明)在同一范围内(这也是 声明)。
  2. statement 中的continue 将执行 iteration-expression
  3. 条件相当于while(true)

from cppreference

iteration-expression你不需要任何东西for(;;)相当于while(true)

迭代表达式中增加会更正常,而不是重复几乎相同的测试。

#include <iostream>

int main()
{
    std::cout << "Write two numbers: " << std::endl;
    int a, b;
    std::cin >> a >> b;
    std::cout << "The numbers between " << a << " and " << b << " are: " << std::endl;

    for (; a < b; ++a)
    {
        std::cout << a << std::endl;
    }
    
    for (; b < a; ++b)
    {
        std::cout << b << std::endl;
    }
} 

【讨论】:

    【解决方案2】:

    for 循环旨在在两个数字之间循环。使用你的 for 循环的意图是不可读的。看看这个

    int end = 10;
    for (int begin = 0; begin < end; ++begin){/*do something*/}
    

    这是 for 循环的标准结构。现在对于您的示例,您将获得以下内容

    #include <algorithm>
    if (a > b) std::swap(a, b);
    for (int begin = a; begin <= b; ++begin){
        std::cout << begin << std::endl;
    }
    

    【讨论】:

    • 操作循环不是“错误的”。而且“没有人这样做”也不对。通常增量是在增量表达式中完成的,但不一定
    • @463035818_is_not_a_number 我已经编辑了我的答案。但是是的,在这种情况下没有人这样做。在 for 循环中从 while 传递条件,它也可以工作,但没有人这样做。
    • 你为什么坚持没有人这样做?反驳很简单,我就是这么做的:godbolt.org/z/P57Mnfh3q。说真的,省略增量表达式并不少见。
    • @463035818_is_not_a_number 我并不是说没有人忽略增量。因为在循环中从向量中擦除时通常需要它。我是说没有人只保留布尔表达式。因为你只会有一个拙劣的while循环。
    • 这也不是真的。如果您已经有可用的计数器,那么只有以下条件并不少见:godbolt.org/z/xYcrcMba6
    【解决方案3】:

    没有必要使用a &lt; b &amp;&amp; ++a &lt; b 之类的东西,因为a &lt; b 包含在++a &lt; b 条件中。因此,只需使用++a &lt; b,您将获得相同的结果。

    现在关于for,你应该这样写只是为了让你的代码更清晰:

    for (; a < b; ++a)
    {
        std::cout << a << std::endl;
    }
    

    我没有使用初始化语句,因为您已经初始化了变量,但是我鼓励您在 for 语句中初始化 a

    一般来说,for 分为三个部分:

    for (<initialization sentence>; <condition sentence>; <post-execution sentence>)
    

    初始化只在到达for语句时运行,在满足条件时循环运行。执行后它通常用于增加或改变条件标准中涉及的变量的状态。唯一的限制是条件必须是布尔语句。

    这些部分都不应该是分配、通用比较或变量增量。您可以使用任何适合您的要求并满足 for 约束的内容。

    总而言之,for 语句是一个 while 的“包裹”结构。两者都可以得到相同的结果。不同之处在于代码的图像更清晰,对算法的理解更好。

    【讨论】:

    • a &lt; b &amp;&amp; ++a &lt; b 防止出现b 小于a 的情况;代码应该在不修改a 的情况下进入第二个循环。诚然,这不是一种显而易见的方式,但你不能忽视这种可能性。
    • 这个答案中的for循环显示a的初始值,但原始代码没有。
    【解决方案4】:

    问题中的代码有点令人困惑,因为它试图同时做几件事。我会把它们分开。

    我只需要更改限制,而不是编写两个循环: 如果 (v2

    现在很简单:

    while (++v1 < v2)
        std::cout << v1 << '\n';
    

    for 循环也是如此。调整限制后,就这样做:

    for ( ; ++a < b; )
        std::cout << a << '\n';
    

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 2017-11-29
      • 2016-04-15
      • 2013-06-28
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多