Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6 - Лекция6_Функции.docx
Скачиваний:
10
Добавлен:
31.03.2015
Размер:
61.69 Кб
Скачать

Void printNumbers(int numbers[], int size) {

for (int i=0; i<size; i++) {

cout << numbers[i];

}

}

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

int max(int m, int n) {

if (m>n) {

return m;

} else {

cout << n;

}

}

определена неправильно, поскольку ветка else не возвращает никакого значения, в то время как функция должна возвращать значение типа int.

Вызов логических функций

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

bool isPrime(int n) {

for (int i=2; i<=n-1; i++) {

if (n%i==0) {

return false;

}

}

return true;

}

int main()

{

//Можно так

isPrime(17) ? cout << "Yes" : cout << "No";

//Или так

for (int i=2; i<100; i++) {

if (isPrime(i)) {

cout << i << endl;

}

}

Глобальные и локальные переменные

Посмотрите на следующий пример:

int x = 10;

Int summa(int y) {

result = x+y;

return x + y;

}

А теперь еще один:

Int summa_version2(int y) {

int x = 10;

result = x+y;

return result;

}

В чем отличие этих двух фрагментов кода? Нетрудно заметить, что отличие заключается в объявлении переменной x: в первом случает она объявлена до функции, а во втором – после. Во что выльется такая разница?

В первом случае переменная является глобальной, т.е. доступной во всех функциях программы, а во втором – локальной, т.е. доступной только внутри функции, где она объявлена. Константы, заданные при помощи директивы #define являются глобальными.

Как Вы думаете, какой вариант правильный? С точки зрения языка программирования правильны оба варианта, поскольку обе программы успешно откомпилируются и при запуске приведут к одному результату. Но с точки зрения хорошего стиля программирования, который, в конечном счете, приводит к более понятным и легко отлаживаемым программам.

Обратите внимание, что данная запись является неправильной:

summa_version2(4,7);

cout << result;

Функция, как и любая другая конструкция языка Си, делит переменные на глобальные и локальные. Локальными являются те переменные, которые описаны внутри функции и, значит, доступны только внутри этой функции. Например, в следующем фрагменте кода переменная result – локальная:

Int summa(int a, int b) {

int result = a+b;

return result;

}

Понятие локальной переменной относится не только к функциям, но и к другим конструкциям языка. Например, в следующем фрагменте переменная i является локальной для цикла:

for (int i=0; i<10; i++) {

}

Переменная, описанная внутри некоторого блока, ограниченного фигурными скобками, является локальной для этого блока:

if (…) {

int x;

}

Обращение к локальной переменной за пределами блока, где она описана, приведет к ошибке компиляции, однако можно описать переменную с таким же именем за пределами этого блока, и это будет уже другая переменная.

Внимание – частая ошибка!

Определять или объявлять функции внутри других функций нельзя! Вызывать можно, но определять или объявлять – нет. Например, следующая программа ошибочна: