¿Se requiere que un programa finalice? En otras palabras, ¿es un programa que se ejecuta para siempre técnicamente Comportamiento indefinido? Tenga en cuenta que esto no se trata de bucles vacíos. Hablar sobre programas que hacen "cosas" (es decir, comportamiento observable) para siempre.
Por ejemplo, algo como esto:
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
}
}
}
Esta es más una cuestión académica, ya que empíricamente todos los compiladores sanos generarán el código esperado para el tipo de programa anterior (suponiendo, por supuesto, que no haya otra fuente de UB). Y sí, por supuesto, hay muchos programas que nunca terminan (os, embebidos, servidores). Sin embargo, el estándar es peculiar a veces, de ahí la pregunta.
Tangencial: muchas definiciones (¿algunas?) De "algoritmo" requieren que un algoritmo deba terminar , es decir, una serie de operaciones que nunca termina no se considera un algoritmo.
Tangencial. El problema de detención establece que no puede existir un algoritmo para determinar si un programa arbitrario termina para una entrada. Sin embargo, para este programa en particular, dado que no hay una rama que conduzca a salir de main, el compilador puede determinar fácilmente que el programa nunca terminará. Sin embargo, esto es irrelevante ya que la pregunta es abogado de idiomas.