Типизированные и нетипизированные функции. Оператор return
Типизированной называется функция, которая по окончании своей работы возвращает значение, а нетипизированной (или void-функцией) – функция, которая ничего не возвращает.
Разница в вызове нетипизированной (void) и типизированной функции:
1. Вызов нетипизированной (void) функции выглядит как оператор:
void Func (int A); // объявление функции void main( ){ Func (10); // вызов – отдельный оператор программы}
2. Вызов типизированной функции является операндом, т.е. частью любого допустимого выражения:
int Func (int A); // объявление функции void main( ){ int A, B, C; C = Func (10);// вызов – часть оператора присваивания C = A + B * Func (10);// вызов – часть арифметического выражения if ( Func (10) < 100 ) . . . // вызов – часть оператора ветвления while (Func (10) > 0 ) . . . // вызов – часть оператора цикла}
Возврат из нетипизированной функции в вызвавшую ее функцию происходит при выполнении последнего оператора в теле функции или реализуется оператором:
return;Возврат из типизированной функции реализуется оператором:
return выражение;Выражение, указанное после return, неявно преобразуется к типу возвращаемого функцией значения и передается в точку вызова функции. Функция может содержать несколько операторов return. В этом случае они будут являться частью оператора (или операторов) ветвления, поэтому из нескольких операторов return всегда выполняется только один.
Примеры:
int f1(){ . . . return 1; } //правильно void f2(){ . . .return 1; } //неправильно, f2 не должна возвращать значение double f3(){ . . .return 1; } //правильно, 1 преобразуется к типу double
ВНИМАНИЕ
Нельзя возвращать из функции указатель (или ссылку) на локальную переменную, поскольку по окончании работы функции она всё равно будет удалена.
Пример:
int* Func (){ int a = 5; return &a; // нельзя!}