Я предполагаю, что код в вашем вопросе - это код, который вы на самом деле компилируете и запускаете:
int main() {
int a = sum(1, 3);
return 0;
}
int sum(int a, int b, int c) {
printf("%d\n", c);
return a + b + c;
}
Звонок на printf
недействителен, поскольку у вас нет требуемого #include <stdio.h>
. Но это не то, о чем вы спрашиваете, поэтому мы проигнорируем это. Вопрос был отредактирован для добавления директивы include.
В стандарте C, начиная со стандарта 1999 года, вызов функции (sum
в этом случае) без видимого объявления является нарушением ограничения . Это означает, что требуется диагностика (но соответствующий компилятор все еще может успешно скомпилировать программу, если он этого захочет). Наряду с синтаксическими ошибками, нарушения ограничений наиболее близки к тому, чтобы сказать, что что-то незаконно. (За исключением директив #error
, которые должны привести к отклонению единицы перевода.)
До C99 у C было «неявное int
» правило, которое означало, что если вы вызываете функцию без видимого объявления, то создается неявное объявление. Это объявление предназначено для функции с типом возвращаемого значения int
и параметрами (повышенных) типов передаваемых вами аргументов. Ваш вызов sum(1, 3)
создаст неявное объявление int sum(int, int)
и сгенерирует вызов , как если бы функция была определена таким образом.
Поскольку это не определено таким образом, поведение не определено. (Скорее всего, значение одного из параметров, возможно, третьего, будет взято из некоторого произвольного регистра или ячейки памяти, но стандарт не говорит ничего о том, что вызовет на самом деле.)
C99 (издание стандарта ISO C 1999 года) отбросило неявное правило int
. Если вы компилируете свой код с помощью соответствующего компилятора C99 или новее, компилятор должен диагностировать ошибку для вызова sum(1, 3)
. Многие компиляторы для обратной совместимости со старым кодом выводят нефатальное предупреждение и генерируют код, который предполагает , определение соответствует неявному объявлению. Многие компиляторы по умолчанию не соответствуют друг другу и могут даже не выдавать предупреждение. (Кстати, если ваш компилятор напечатал сообщение об ошибке или предупреждение, это очень полезно, если вы включите его в свой вопрос.)
Ваша программа глючит. Соответствующий C-компилятор должен по крайней мере предупредить вас об этом и, возможно, отклонить его. Если вы запустите его, несмотря на предупреждение, поведение не определено.