Нет определенного типа параметра функции по умолчанию для int? Я сошел с ума?

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

#include  char toChar(n) { //sizeof n is 4 on my 32 bit system const char *alpha = "0123456789ABCDEF"; return alpha[n]; } int main() { putchar(toChar(15)); //ie return 0; } 

Я уверен, что основные значения по умолчанию для int большинством компиляторов некоторого стандартного (но только для возврата), это также поведение, истинное для других функций, или эта реализация определена? Кажется, это просто необычно, мой компилятор – это немного устаревший GCC-порт (MinGW).

    Объявление функции стиля K & R:

     void foo(n) int n; { } 

    Если тип не указан, по умолчанию используется значение int. Это действительно на C89, а не на C99

    @ Ответ Эрика верен, но (ИМО) можно было бы неправильно понять.

    У вас есть определение стиля K & R, это совершенно верно. Поскольку int считается типом по умолчанию, если у вас есть что-то вроде: foo(n) { } , это означает тип возврата, а тип n по умолчанию – int .

    C99 (в основном) удаляет правило «по умолчанию int», но не полностью удаляет определения стиля K & R. Это означает, что вышеизложенное определение больше не допускается; для определения foo с теми же типами, что и выше, вы все равно можете использовать:

     int foo(n) int n; { } 

    То есть, определение стиля K & R по-прежнему разрешено, но вам нужно указать тип возвращаемого значения и тип параметра, даже если тип int.

    Этот стиль определения функции, однако, устаревает (согласно § 6.11.7). Это действительно все еще разрешено ради древнего (предстандартного) кода. Вы не хотите писать новый код таким образом, даже если это технически разрешено. Для нового кода вы явно хотите использовать определение типа прототипа:

     int foo(int n) {} 

    Тем, кто заботится о таких вещах, определение стиля K & R все еще используется в каком-то новом коде. Его стиль terser может быть полезен (используя термин свободно) в кодовом гольф.

    Пока мы находимся в этом: ответ @ stijn тоже правильный. В частности, когда функция определена таким образом (Ie, K & R style), все аргументы подлежат поощрению по умолчанию. Это означает, что если вы передадите целочисленный тип, меньший, чем int , он будет повышен до int перед передачей, и если вы передадите float , его будет повышать до double .

    afaik это называется продвижением аргументов. я не помню точных правил, но дело доходит до того, что компилятору разрешено использовать int для аргументов, когда он (она?) еще не знает прототип функции.

    Давайте будем гением компьютера.