Как этот "привет мир!" программа работает?
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, а продукт возвращается основной функцией.