程序永远不会终止有效的C ++程序吗?

是否需要终止程序?换句话说,是一个在技术上永远无法运行的程序吗?请注意,这与空循环无关。谈论永远做“东西”(即可观察到的行为)的程序。

例如像这样的东西:

int main()
{
    while (true)
    {
        try
        {
            get_input(); // calls IO
            process();
            put_output(); // calls IO,has observable behavior

            // never break,exit,terminate,etc
        } catch(...)
        {
            // ignore all exceptions
            // don't (re)throw
            // never go out of loop
        }
    }
}

这更多是一个学术问题,因为根据经验,所有理智的编译器都会为上述程序生成预期的代码(当然,假设没有其他UB来源)。是的,当然,有很多程序永远都不会终止(操作系统,嵌入式服务器)。但是,有时标准是古怪的,因此是个问题。


切线:许多(一些?)“算法”的定义要求算法必须终止,即,一系列永不终止的运算不被视为算法。


切线。暂停问题指出,无法存在一种算法来确定任意程序是否针对输入完成。但是,对于该特定程序,由于没有导致退出main的分支,因此编译器可以轻松确定该程序永远不会结束。但是,这无关紧要,因为问题是语言律师。

beibei0524 回答:程序永远不会终止有效的C ++程序吗?

在C ++标准中,没有什么要求该程序或任何给定的线程终止。最接近的是[intro.progress]p1,它表示

  

该实现可以假定任何线程最终都会执行以下操作之一:

     
      
  • 终止,
  •   
  • 调用库I / O函数,
  •   
  • 通过可变的glvalue执行访问,或
  •   
  • 执行同步操作或原子操作。
  •   
     

[注意:]旨在允许编译器转换,例如删除空循环,即使无法证明终止也是如此。 — 尾注]

只要有一些可观察到的行为,或者最终,或者只要它花所有的时间来阻塞I / O操作或另一个阻塞库调用,就不适用,并且该程序有效(假设它符合所有其他有效性标准)。

,

是的。来自[intro.progress]

  

该实现可以假定任何线程最终都会做一个   以下:

     
      
  • 终止,
  •   
  • 调用库I / O函数,
  •   
  • 通过可变的glvalue执行访问,或
  •   
  • 执行同步操作或原子操作。
  •   
     

[注意:这是为了允许编译器转换,例如删除   空循环,即使无法证明终止也是如此。 — 尾注]

本文链接:https://www.f2er.com/3160710.html

大家都在问