web-dev-qa-db-fra.com

bonjour le monde en C sans point-virgule et sans instructions IF / WHILE / FOR

Mon ami dit qu'il est possible d'écrire un programme C qui imprimera "bonjour le monde" sans IF/WHILE/FOR et sans point-virgule. Après des recherches minimales, je lui ai dit que ce n'était pas possible. C'est possible?

J'ai essayé de trouver un moyen "portable" de voler un point-virgule 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 l'un typedef unsigned char uint8_t pour devenir mon printf.

Une autre astuce qui a fonctionné était de #define loin tous les types stdint standard tels que stdint.h se réduit à un tas de points-virgules.

Les deux tombent à plat sur FreeBSD car il utilise des types intermédiaires privés (comme __uint8_t), ce qui signifie que la suppression de typedef échoue dans l'exemple cité et m'empêche de supprimer avec succès tous les non-points-virgules dans l'autre cas.

Il semble qu'il devrait être possible de voler proprement un point-virgule dans un fichier inclus. Quelqu'un peut-il améliorer ma tentative?

74
Ben Jackson
#include <stdio.h>

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

Si votre ami dit "oh, vous ne pouvez pas non plus utiliser le commutateur", alors:

#include <stdio.h>

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

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

#error hello world

(si rien d'autre, peut-être cela évitera-t-il un suivi "comment imprimer hello world sans main" ...)

41
Ben Jackson

il est possible d'écrire un programme 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 ne l'est pas.

19
JeremyP

Vous pouvez également contourner la limitation comme

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

Qu'en est-il de:

#include <stdio.h>
int main(void *HAHA[printf("Hello world!\n")]) {}

n'est pas cool :)

15
steabert

vous pouvez utiliser l'instruction switch pour obtenir la sortie désirée, voici le code ci-dessous

#include<stdio.h>

int main()
{
  switch(printf("hello world"))

return 0;
}

j'espère que ceci vous aidera

2
Zishan