Как этот "привет мир!" программа работает?

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

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

Ответ 1

Две вещи:

  • Указатели функций не разыгрываются так же, как другие указатели. *main == main
  • Список, разделенный запятой, возвращает значение последнего элемента в списке

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

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 остается в качестве упражнения для читателя.

Ответ 2

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

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

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