Как работает этот "привет мир!" программная работа? - PullRequest
23 голосов
/ 19 апреля 2010
int main(void)
{ 
    return('yes', *"no", **main, *********printf) ("hello world!\n") *0; 
}

выводит hello world!, но как это на самом деле работает?

Ответы [ 2 ]

46 голосов
/ 19 апреля 2010

Две вещи на самом деле:

  1. Функциональные указатели не разыменовываются так же, как и другие указатели. *main == main
  2. Список через запятую возвращает значение последнего элемента в списке

Итак, если мы упростим указатели:

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

И использование последнего элемента в списке в качестве значения списка

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

printf возвращает количество напечатанных символов

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

А 13 * 0 оставлено читателю в качестве упражнения.

12 голосов
/ 19 апреля 2010
('yes', *"no", **main, *********printf) 

будет иметь значение *********printf, потому что оператор запятой оценивает свои операнды и возвращает значение последнего выражения. *********printf равно printf, поскольку разыменование указателя на функцию приводит к тому же указателю на функцию; это ничего не делает.

Затем, результат первой круглой скобки, printf, применяется к ("привет мир! \ N"), в результате чего текст выводится на экран Функция printf возвращает количество написанных символов. Затем это число умножается на 0, и произведение возвращается основной функцией.

...