【问题标题】:infinite for loops in c++C ++中的无限for循环
【发布时间】:2021-11-11 10:57:44
【问题描述】:

我正在玩一些 for 循环,尝试了以下代码并得到了一个无限循环。

#include<iostream>

int main(){
       int i {0};
       bool condition = i < 5;
       for ( ; condition ; ){
              std::cout << "Hello World!" << std::endl;
              i++;  
       }
}  

谁能解释一下原因?

【问题讨论】:

    标签: c++ for-loop


    【解决方案1】:
    bool condition = i < 5;
    

    这一行定义了一个名为 condition 的变量,从这一行开始,它的值就是 true

    不从右侧绑定表达式,只复制赋值时的结果。

    你想要的更复杂:

    auto condition = [&i](){ return i < 5; };
    for ( ; condition() ; )
    

    现在condition 是一个可以重复计算的函数对象。

    赋值的右手称为 lambda 表达式,形式为 [capture scope](parameters){ body with return statement }

    在捕获范围内,您可以按值(不带&amp;)列出变量,在这种情况下它们会在声明 lambda 时被复制一次,或者通过引用(带前导&amp;)在这种情况下它们不会' t 被复制,但 lambda 内部的变量是对 lambda 外部同名变量的引用。还有一种缩写形式 [&amp;] 通过引用捕获父作用域中的所有变量,[=] 按值捕获所有变量。

    auto 可用于组合声明+赋值中的简洁性,并自动从右侧解析变量的类型。

    您可以显式指定的最接近的兼容类型是std::function&lt;bool(void)&gt;(具有该签名的函数的通用容器),该对象的实际类型是表示您无法显式编写的裸 lambda 的某种内部类型。所以如果你不知道确切的类型,又不想使用泛型容器类型,auto 有时甚至是必要的。

    【讨论】:

    • 你能解释一下自动线吗
    • @KenZa auto 意味着,如果可能,让 C++ 自动推断类型:) 条件的值是一个 lambda - 一个匿名(无名)函数,可以分配给变量,在本例中为 condition。它的类型将从 lambda 定义中推断为bool
    • @JoshGreifer 我知道'auto',我的意思是整行,据我了解,'return i
    • 几乎:该函数不会更改i 的值,但每次调用时都会“引用”它。
    • @KenZa 它是闭包的捕获块,它说它通过引用捕获标识符i。见What is a lambda expression in C++11?
    【解决方案2】:

    C++ 中的变量存储值。您似乎认为condition 以某种方式与表达式i &lt; 5 保持联系。它不是。一旦您在分配时设置了 true 的值,它将保持该值,直到您更改它。你永远不会再改变它,所以condition 的值永远是true

    【讨论】:

    • 是的,我现在在循环内重新编写了“条件”的定义,它工作得非常好,非常感谢。顺便说一句,我在调试多个文件时遇到了问题,想知道您是否可以帮助我解决这个问题?
    【解决方案3】:

    引用cppref:

    执行一次init-statement,然后重复执行statement和iteration-expression,直到condition的值变为false。测试在每次迭代之前进行。

    现在,您的条件评估为真:

    bool condition = i < 5; // true
    

    因此,循环将一直持续到 false,这不会发生在代码的循环体中; condition在初始化后不会被写入,因此循环不会停止。

    【讨论】:

      【解决方案4】:

      for 循环在一个条件下运行,例如 while i 低于指定值,并将继续运行直到不再满足此条件。在您的情况下,它永远不会满足,保证无限循环。

      【讨论】:

      • @LarrytheLIama 为什么条件永远不满足?我每次都在增加 i 的值,所以当它达到 5 时,布尔值通常为 false,所以 for 循环应该停止,不是吗?
      • 您不会不断更新条件,只是从开始(当 i 为 0 时)开始。
      • @LarrytheLIama 是的,我在循环中添加了条件,它现在可以工作了
      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2012-03-04
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多