2010-04-19 6 views
23
int main(void) 
{ 
    return('yes', *"no", **main, *********printf) ("hello world!\n") *0; 
} 

sort hello world!, mais comment cela fonctionne-t-il réellement?Comment cela "Bonjour tout le monde!" programme de travail?

+2

'return ('yes', *" non ", ** main, ********* printf) (" C'est magique! \ N ") * 0;' En passant, je l'ai compilé et cela fonctionne réellement. – Warty

+0

vous avez un style étrange pour écrire des logiciels! Vous ne recevrez jamais de travail chez moi. :-) – Oleg

+0

C est vraiment un langage pervers :-) –

Répondre

46

Deux choses vraiment:

  1. pointeurs de fonction ne déréférence pas la même chose que d'autres pointeurs. *main == main
  2. séparés par des virgules renvoie la valeur du dernier élément de la liste

Donc, si nous simplifions les pointeurs:

int main(void) 
{ 
    return('yes', *"no", main, printf) ("hello world!\n") *0; 
} 

Et en utilisant le dernier élément de la liste que la valeur de la liste

int main(void) 
{ 
    return printf("hello world!\n") *0; 
} 

printf renvoie le nombre de caractères imprimés

int main(void) 
{ 
    return 13 *0; 
} 

Et 13 * 0 est laissé comme un exercice au lecteur.

+10

Votre icône Gravatar est bizarre, mais néanmoins bonne réponse –

+0

Certains de mes amis avaient un concours de moustache et je devais me raser. Donc, je portais une fausse moustache ce jour-là. – rampion

+3

+1 pour l'exercice au lecteur;) –

12
('yes', *"no", **main, *********printf) 

évaluera à *********printf, parce que l'opérateur virgule évalue ses opérandes et renvoie la valeur de l'expression dernière. *********printf est égal à printf, car le pointeur de fonction de déréférencement donne le même pointeur de fonction; ça ne fait rien.

Ensuite, le résultat de la première parenthèse, printf, est appliqué à ("bonjour monde! \ N") ce qui entraîne l'impression du texte à l'écran. La fonction printf renvoie le nombre de caractères écrits. Ce nombre est ensuite multiplié par 0 et le produit est renvoyé par la fonction principale.

Questions connexes