È necessario terminare un programma? In altre parole, è un programma che funziona per sempre tecnicamente un comportamento indefinito? Nota che non si tratta di loop vuoti. Parlando di programmi che fanno "cose" (cioè comportamenti osservabili) per sempre.
Ad esempio qualcosa del genere:
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
}
}
}
Questa è più una domanda accademica, dal momento che empiricamente tutti i compilatori sani genereranno il codice previsto per il tipo di programma di cui sopra (supponendo ovviamente che non vi siano altre fonti di UB). E sì, ovviamente ci sono molti programmi che non si chiudono mai (os, embed, server). Tuttavia lo standard è a volte bizzarro, quindi la domanda.
Tangenziale: molte (alcune?) Definizioni di "algoritmo" richiedono che un algoritmo debba terminare , ovvero una serie di operazioni che non si interrompe mai non è considerata un algoritmo.
Tangenziale. Il problema di arresto afferma che non può esistere un algoritmo per determinare se un programma arbitrario termina per un input. Tuttavia, per questo particolare programma poiché non esiste alcun ramo che porta a uscire da main, il compilatore può facilmente determinare che il programma non finirà mai. Ciò è tuttavia irrilevante in quanto la domanda è un avvocato di lingua.