2012-02-02 4 views
12

je suis tombé sur cette little quine program, écrit sans méthode principale:programme Quine sans main()

enum f { 
    f; 
    System z; 
    String s="enum f{f;System z;String s=%c%s%1$c;{z.out.printf(s,34,s);z.exit(0);}}"; 
    {z.out.printf(s,34,s); 
    z.exit(0);} 
} 

quelqu'un peut-il expliquer comment ça marche? Merci.

+0

Intéressant, mais comment le laissez-vous fonctionner? EDIT: Le fichier doit être nommé 'f.java', donc vous le compilez avec' javac f.java' – mtsz

+1

Oui. Vous le compilez avec 'javac f.java' et l'exécutez avec' java f'. Cela fonctionne avec jdk6, mais pas avec 7. –

+0

Après avoir lu la description que vous avez posté, je l'ai fait fonctionner, merci néanmoins :) – mtsz

Répondre

9

Les lignes 5 et 6 sont instance initializer. Il est appelé lorsque la classe est instanciée. Comme il s'agit d'une énumération avec une constante nommée f, elle va être instanciée une fois et le bloc d'initialisation de l'instance est exécuté.

Notez que z est null, mais out est un membre statique de la classe System, de sorte que vous pouvez appeler z.out.printf() de toute façon. L'instruction printf prend la chaîne s en tant que chaîne de format avec deux arguments, 34 et s lui-même.

34 est le code ASCII pour le guillemet double ". Il est rempli pour les %c et %1$c dans la chaîne de format. Le %s dans la chaîne de format est remplacé par la chaîne de format s elle-même.

Questions connexes