【问题标题】:Using cin in for loop defiition在 for 循环定义中使用 cin
【发布时间】:2017-01-19 23:47:30
【问题描述】:

我正在创建一个在 for 循环体中使用 std::cin 的简单程序。

#include <iostream>

int main()
{
    float a = 0;
    for (std::cin >> a; a >= 0;std::cin >> a) {
        std::cout << "\t "<<a<<"\n";
    }
    return 0;
}

这个程序在a 中取值并打印它,直到你输入一个负数。 但是当我将for 循环定义修改为for(std::cin &gt;&gt; a; a &gt;= 0;) 时,它只会永远打印第一个数字。我想知道为什么会这样。是因为缺少循环增量部分吗?

【问题讨论】:

  • 因为你去掉了暂停程序等待用户输入新号码的部分。
  • 为什么不直接使用while循环呢?然后您可以在循环结束时获取用户输入并检查他们是否输入了哨兵值 - 如果没有,它将再次运行。
  • 当然。但我的问题是为什么for(std::cin &gt;&gt; a; a &gt;= 0;) 不起作用

标签: c++


【解决方案1】:

我认为没有什么好怀疑的;省略 for 循环的“第三”部分意味着除了循环体之外,每次迭代后都不会执行任何操作;因此,一旦通过提供a &gt;= 0 的值进入循环,并且只要您不更改循环主体中a 的值(并且std::cout &lt;&lt; "\t "&lt;&lt;a&lt;&lt;"\n" 不会更改a),循环将“永远”运行,始终打印 a 的初始值。

【讨论】:

    【解决方案2】:

    for 不适合这些情况。使用while 而不是for

    当您知道要执行循环的多少次迭代时,通常会使用 for 循环 - 或者它是可计算的。 while 循环或 do...while 循环在这里比 for 循环更合适,因为您不知道用户想要执行多少次循环。

    这里有一些参考资料,可以为您提供有关 C++ 中循环结构类型之间差异的更多信息。

    https://www.programiz.com/cpp-programming/do-while-loop http://www.cprogramming.com/tutorial/lesson3.html

    #include <iostream>
    
    int main()
    {
        float a = 0;
        while(a>=0){
            std::cout << "value: ";
            std::cin >> a;
        }
    
        return 0;
    }
    

    下面是更好的方法。

    #include <iostream>
    
    int main()
    {
        float a;
        do{
            std::cout << "value: ";
            std::cin >> a;
        }
        while(a>=0);
    
        return 0;
    }
    

    【讨论】:

    • "for 不适合这些情况" -- 为什么不呢?
    • 感谢您的回答。但我的问题是为什么 for(std::cin &gt;&gt; a; a &gt;= 0;) 不起作用。
    • @PaulR 已更新。
    【解决方案3】:

    在这个for循环中

    for(std::cin >> a; a >= 0;) 
    

    语句std::cin &gt;&gt; a 的第一个表达式在循环的第一次迭代之前只计算一次。所以变量a在循环内不会再改变,循环将是无限的。

    考虑到这个循环

    for (std::cin >> a; a >= 0;std::cin >> a) {
        std::cout << "\t "<<a<<"\n";
    }
    

    也是错误的,因为用户可以中断输入。在这种情况下,变量a 不会被更改,您将再次获得无限循环。

    代替这些陈述

    float a = 0;
    for (std::cin >> a; a >= 0;std::cin >> a) {
        std::cout << "\t "<<a<<"\n";
    }
    

    写出来会更好

    for ( float a; std::cin >> a && a >= 0; ) {
        std::cout << "\t "<<a<<"\n";
    }
    

    不需要在循环外声明变量a,因为它只在循环内使用。

    【讨论】:

      【解决方案4】:

      你是对的!

      当第一次调用循环时,这段代码会执行

      int i = 0
      

      之后它会检查测试

      i >= 0
      

      对于每次迭代,它都会检查测试,然后检查增量部分

      for (int i = 0; i >= 0;std::cin >> a) {
         //code
      }
      

      并且由于您将增量部分留空,因此 a 将永远打印!

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 1970-01-01
        • 2020-08-03
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        相关资源
        最近更新 更多