Возврат Значения
Из функции, которая не описана как void, можно (и должно) возвращать значение. Возвращаемое значение задается оператором return. Например:
int fac(int n) {return (n1) ? 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;} // так не делайте