Из функции, которая не описана как void, можно (и должно) возвращать значение. Возвращаемое значение задается оператором return. Например:
int fac(int n) {return (n>1)? n*fac(n-1): 1; }В функции может быть больше одного оператора return:
int fac(int n) { if (n > 1) return n*fac(n-1); else return 1; }Как и семантика передачи параметров, семантика возврата функцией значения идентична семантике инициализации. Возвращаемое значение рассматривается как инициализатор переменной возвращаемого типа. Тип возвращаемого выражения проверяется на согласованность с возвращаемым типом и выполняются все стандартные и определенные пользователем преобразования типов. Например:
double f() { //... return 1; // неявно преобразуется к double(1) }Каждый раз, когда вызывается функция, создается новая копия ее параметров и автоматических переменных. После возврата из функции память используется заново, поэтому возвращать указатель на локальную переменную неразумно. Содержание указываемого места изменится непредсказуемо:
int* f() { int local = 1; //... return &local; // так не делайте }Эта ошибка менее обычна, чем эквивалентная ошибка при использовании ссылок:
int& f() { int local = 1; //... return local; // так не делайте }К счастью, о таких возвращаемых значениях предупреждает компилятор. Вот другой пример:
int& f() { return 1;} // так не делайте