61 votes

Bonjour tout le monde en C, sans point-virgule et sans instruction IF / WHILE / FOR

Mon ami dit qu'il est possible d'écrire un programme en C qui imprimera "hello world" sans IF/WHILE/FOR et sans points-virgules. Après des recherches minimes, je lui ai dit que ce n'était pas possible. C'est possible?

198voto

cdhowie Points 62253
 #include <stdio.h>

int main() {
    switch (printf("Hello, world!\n")) {}
}
 

Si votre ami dit "oh, vous ne pouvez pas utiliser l'interrupteur non plus", alors:

 #include <stdio.h>

int main(int argc, char *argv[printf("Hello, world!\n")]) {}
 

74voto

Ben Jackson Points 28358

J'ai essayé de trouver un "portable" le vol d'un point-virgule à partir d'un fichier include. Cela fonctionne sous Linux:

int main(int ac, char **av)
{
#define typedef
#define uint8_t a[printf("hello world\n")]
#include <stdint.h>
}

Cela provoque une typedef unsigned char uint8_t devenir mon printf.

Une autre astuce qui a fonctionné a été de #define suite tous les standard stdint type tel que stdint.h réduit à un tas de points-virgules.

Deux de ces tomber à plat sur FreeBSD, car il utilise privé des types intermédiaires (comme __uint8_t), ce qui signifie que la suppression de typedef échoue dans l'exemple cité et m'empêche de l'éliminer tous les non-points-virgules dans les autres cas.

Il me semble qu'il devrait être possible de voler un point-virgule proprement à partir d'un fichier include. Quelqu'un peut-il améliorer ma tentative?

41voto

Ben Jackson Points 28358

Je suis déchirée sur l'opportunité de suggérer ceci parce que cela dépend du libellé exact de la question, mais:

 #error hello world
 

(Si rien d'autre, cela évitera peut-être un suivi "comment imprimer Bonjour tout le monde sans main " ...)

19voto

JeremyP Points 46808

il est possible d'écrire un programme en C qui imprimera "hello world" sans IF / WHILE / FOR et sans point-virgule.

Facile. Notez que C est sensible à la casse.

 int main()
{
    if (printf("Hello, World\n")){}
}
 

if est un mot clé en C, IF n'est pas.

16voto

KennyTM Points 232647

Vous pouvez également contourner la limitation comme

 #define X i##f
#define Y whi##le
#define Z f##or
#define W swi##tch
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X