La version C

Après nettoyage des commentaires C, le source original devient :
cat =13 ;
main()
{
write( cat-~-cat ,"Hello, world!" , cat);
putchar(~-~-~-cat); 
}

La déclaration cat =13 ; est valide en C K&R mais obsolète en ANSI C : elle est équivalente à int cat =13 ; Cette forme est cependant encore généralement acceptée (avec un warning) par les compilateurs. La suite ne fonctionne correctement que sur une machine satisfaisant aux deux contraintes suivantes :

  1. être une machine UNIX pour disposer de l'appel noyau write ;
  2. avoir les entiers négatifs représentés en complément à 2. Dans ce cas en effet, ~-x vaut x - 1.
Donc cat-~-cat vaut 1 qui, en premier paramètre de write désigne la sortie standard, et ~-~-~-13 vaut 10 (le code de newline). Le troisième paramètre passé à write doit être la longueur de la chaîne à imprimer, ici 13 qui est bien la longueur de Hello, world!. Au final, ce programme imprime « Hello world ».

Matthieu Moy 2017-02-08