Почему этот фрагмент кода компилируется?

Почему выполняется компиляция следующего кода?

#include <stdio.h>

int main(void) {
    getchar;
}

Ответ 1

Поскольку имена функций - это псевдонимы, чтобы использовать указатели на те функции, которые сами по себе являются целыми числами. Это семантически очень похоже на

#include <stdio.h>

int main(void) {
    42;
}

Это действительно, но бессмысленно.

Ответ 2

По той же причине 1; будет компилироваться, getchar - это просто адрес функции. Результат оценивается, затем отбрасывается. В спецификации языка он называется "выражением выражения";

Ответ 3

C странно, этот код тоже компилируется, но он segfaults который для записи, является наименьшим segfault в C история.

main;