Типизированные и нетипизированные функции. Оператор 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; // нельзя!}