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?
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?
Deux choses vraiment:
*main == main
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.
Votre icône Gravatar est bizarre, mais néanmoins bonne réponse –
Certains de mes amis avaient un concours de moustache et je devais me raser. Donc, je portais une fausse moustache ce jour-là. – rampion
+1 pour l'exercice au lecteur;) –
('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.
'return ('yes', *" non ", ** main, ********* printf) (" C'est magique! \ N ") * 0;' En passant, je l'ai compilé et cela fonctionne réellement. – Warty
vous avez un style étrange pour écrire des logiciels! Vous ne recevrez jamais de travail chez moi. :-) – Oleg
C est vraiment un langage pervers :-) –