Функции. Основные принципы структурной методологии. Принцип формальности. Принцип иерархического упорядочивания, страница 5

starline();                       //вызов функции

cout << "char        -128 to 127" << endl

<< "short       -32,768 to 32,767" << endl

<< "int         System dependent" << endl

<< "long        -2,147,483,648 to 2,147,483,647" << endl;

starline();                       //вызов функции

return 0;

   }

Обмен данными между функциями можно реализовать:

§  через возвращаемое значение (оператор return);

§  через глобальные переменные (что не является хорошим стилем программирования);

§  через механизм параметров;

§  через файлы на внешних запоминающих устройствах.

Механизм возврата из функции в вызвавшую ее функцию реализуется оператором return выражение. Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значения, указывается тип void.

Выражение, указанное после return, неявно преобразуется к типу возвращаемого функцией значения и передается в точку вызова функции. Как частный случай выражения, можно возвращать константу или значение одной переменной. Оператор может быть единственным в функции:

float MyFunc1(float x, float y)

{return x+y;}

Функция может содержать несколько операторов return (это определяется потребностями алгоритма) и такой оператор не обязательно должен быть в конце функции. Но выполняется всегда один из операторов. Например, следующий вариант:

float MyFunc2A(float x, float y)

{if (x>y) return x+y;

else return x*y;

          }

короче, чем

float MyFunc2B(float x, float y)

{float r;

if (x>y) r=x+y;

else r= x*y;

return r;

}

Это можно реализовать еще компактнее с помощью тернарной операции:

float MyFunc2(float x, float y)

{ return x>y ? x+y : x*y;

          }

Оператор return прекращает работу любой функции, в том числе и типа void. То есть он не обязательно должен иметь возвращаемое значение. Если функция описана как void, выражение не указывается. Оператор return можно опускать для функции типа void, если возврат из нее происходит перед закрывающей фигурной скобкой, и для функции main. Тогда return просто осуществляет выход из функции, не возвращая никакого значения.

Если из функции необходимо вернуть более одного значения, то для этого требуется использование дополнительных параметров и  организация их передачи по указателю или по ссылке. Но об этом поговорим чуть позже.

Нельзя возвращать из функции указатель на локальную переменную, поскольку память, выделенная локальным переменным при входе в функцию, освобождается после возврата из нее.

Например:

int *f() {

int a=5;

return &a;     //нельзя!!!! }

// демонстрация использования глобальных переменных //при обменен данными между функциями

#include <iostream.h>

#include <conio.h>        //для getch()

char ch = 'a';                  //глобальная переменная ch описана вне всех функций

void getachar();            //прототипы функций

void putachar();

int main()

   {

while( ch != '\r' )        // глобальная переменная ch доступна в main()

{

getachar();             //вызов функций

putachar();

}

cout << endl;

return 0;

}

//-------------------------------------------------------------void getachar()           // глобальная переменная ch доступна в getachar()

  {

ch = getch();

   }

//-------------------------------------------------------------void putachar()           // глобальная переменная ch доступна в putachar() 

 {

cout << ch;

}

Напомним еще раз, что локальная статическая переменная размещается в сегменте данных и инициализируется только при первом обращении к функции, сохраняя в дальнейшем свое значение:

// демонстрация использования в функции локальных статических переменных

#include <iostream.h>

float getavg(float);                       //прототип функции