Как вызовы функций с параметрами работают в C?

Я изучаю C и наткнулся на то, что мне было любопытно. Для меня вызов foo в main, как показано ниже, ничего не возвращает:

int foo(bar){
    return bar * 2;
}

int main(){
    foo(10);
}

Только когда я отформатирую вывод с помощью printf, он вернет результат из foo в main. Так задумано или я что-то упускаю? Следующий пример работает:

int foo(bar){
    return bar * 2;
}

int main(){
    // will return 20
    printf("%d\n", foo(10));
}

person l0ngcat    schedule 23.10.2019    source источник
comment
В первом примере вы проигнорировали возвращаемое значение из foo(). Вам необходимо ее использовать, но в этом случае бессмысленно вызывать функцию, если вы игнорируете ее результат. Во втором примере вы передаете возвращаемое значение в printf().   -  person Weather Vane    schedule 24.10.2019
comment
Не могли бы вы немного упростить это для меня? Я очень новичок в программировании в целом. Что вы имеете в виду, говоря, что я проигнорировал возвращаемое значение в первом примере? В настоящее время у меня сложилось впечатление, что переменная 'bar', возвращаемая в 'foo()', будет передана в параметры функции. Разве это не так?   -  person l0ngcat    schedule 24.10.2019
comment
Ну, вы говорите, что foo() не возвращает значение, но это так. Вы можете получить и передать это значение, скажем, с помощью int retval = foo(10); printf("%d\n", retval);. Второй пример более сложен, так как вы никогда не видите возвращаемое значение, а передаете его непосредственно в printf.   -  person Weather Vane    schedule 24.10.2019
comment
Ваша функция foo() возвращает значение. Вам нужно «поймать» это значение либо в переменной (другое целое число), либо через функцию (как вы сделали, используя printf()). В первом примере вы ничего не сделали с возвращаемой переменной foo()' .   -  person Xofo    schedule 24.10.2019
comment
Все отличные ответы, теперь я понимаю. Спасибо!   -  person l0ngcat    schedule 24.10.2019
comment
Примите ответ ниже (см. галочку).   -  person Xofo    schedule 24.10.2019


Ответы (2)


Вызов функции foo(10) в

    int foo(bar){
        return bar * 2;
    }

    int main(){
        foo(10);
    }

действительно возвращает значение. Но вы не записывали его ни в какую переменную и не печатали возвращаемое значение. Ваш второй пример фактически печатает значение, возвращаемое из foo(10);

person Kavitha Karunakaran    schedule 23.10.2019
comment
Думаю, теперь я это понимаю. Таким образом, функция правильно возвращает значение, но, поскольку для хранения возвращаемого значения не используется ни переменная, ни оператор printf для печати возврата, она никогда не отображается при выполнении программы? - person l0ngcat; 24.10.2019

Уже есть полезный ответ, так что вот более технический ответ:

Во втором примере вы напечатали результат foo(10), но есть способ реально вернуть значение из программы на C.

int main() {
    return 14;
}

Сразу после запуска скрипта в оболочке echo $? (или echo %errorlevel% в Windows) напечатает код выхода программы, который для простой программы на C является значением, возвращаемым main.

Обычно значение 0 означает успех, а все остальное указывает на ту или иную ошибку. Другой распространенный способ сгенерировать код выхода — передать целое число (или константы EXIT_SUCCESS или EXIT_FAILURE) в функцию exit из stdlib.h.

(Конечно, вы обычно хотите распечатать результаты своей программы или записать их в файл, чтобы их было легко просмотреть или сохранить на потом, но это тип различия, о котором может быть полезно знать, даже если не так часто встречается)

person jirassimok    schedule 23.10.2019