Faut-il terminer un programme? En d'autres termes, un programme qui s'exécute pour toujours Comportement indéfini techniquement? Notez qu'il ne s'agit pas de boucles vides. Parler de programmes qui font des "trucs" (c'est-à-dire un comportement observable) pour toujours.
Par exemple quelque chose comme ça:
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
}
}
}
Il s'agit davantage d'une question académique, car empiriquement tous les compilateurs sensés généreront le code attendu pour le type de programme ci-dessus (en supposant bien sûr qu'aucune autre source d'UB). Et oui, bien sûr, il y a beaucoup de programmes qui ne se terminent jamais (os, embarqués, serveurs). Cependant, la norme est parfois excentrique, d'où la question.
Tangentiel: de nombreuses (certaines?) Définitions d '"algorithme" exigent qu'un algorithme se termine , c'est-à-dire qu'une série d'opérations qui ne se termine jamais n'est pas considérée comme un algorithme.
Tangentiel. Le problème d'arrêt indique qu'il ne peut pas exister d'algorithme pour déterminer si un programme arbitraire se termine pour une entrée. Cependant, pour ce programme particulier, car il n'y a pas de branche qui conduit à sortir du principal, le compilateur peut facilement déterminer que le programme ne se terminera jamais. Ceci n'est cependant pas pertinent car la question est la langue-avocat.