
- •Объявление переменных в итерационных инструкциях и инструкциях выбора
- •Формальные параметры
- •Глобальные переменные
- •Функции
- •Вызов функций с массивами
- •Передача функциям строк
- •Аргументы функции main(): argc и argv
- •Передача числовых аргументов командной строки
- •Преобразование числовых строк в числа
- •Возврат значений
- •Функции, которые не возвращают значений (void-функции)
- •Функции, которые возвращают указатели
- •Прототипы функций
- •Подробнее о заголовках
- •Рекурсия
Возврат значений
Каждая функция, кроме типа void, возвращает какое-нибудь значение. Это значение явно задается с помощью инструкции return. Другими словами, любую не void-функцию можно использовать в качестве операнда в выражении. Следовательно, каждое из следующих выражений допустимо в C++.
х = power(у);
if(max(х, у)) > 100) cout << "больше";
switch(abs (х)) {
Несмотря на то что все не void-функции возвращают значения, они необязательно должны быть использованы в программе. Самый распространенный вопрос относительно значений, возвращаемых функциями, звучит так: "Поскольку функция возвращает некоторое значение, то разве я не должен (должна) присвоить это значение какой-нибудь переменной?". Ответ: нет, это необязательно. Если значение, возвращаемое функцией, не участвует в присваивании, оно попросту отбрасывается (теряется).
Рассмотрим следующую программу, в которой используется стандартная библиотечная функция abs().
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int i;
i = abs(-10); // строка 1
cout << abs(-23); // строка 2
abs(100); // строка
return 0;
}
Функция abs() возвращает абсолютное значение своего целочисленного аргумента. Она использует заголовок <cstdlib>. В строке 1 значение, возвращаемое функцией abs(), присваивается переменной i. В строке 2 значение, возвращаемое функцией abs(), ничему не присваивается, но используется инструкцией cout. Наконец, в строке 3 значение, возвращаемое функцией abs(), теряется, поскольку не присваивается никакой другой переменной и не используется как часть выражения.
Если функция, тип которой отличен от типа void, завершается в результате обнаружения закрывающейся фигурной скобки, то значение, которое она возвращает, не определено (т.е. неизвестно). Из-за особенностей формального синтаксиса C++ не void-функция не обязана выполнять инструкцию return. Это может произойти в том случае, если конец функции будет достигнут до обнаружения инструкции return. Но, поскольку функция объявлена как возвращающая значение, значение будет таки возвращено, даже если это просто "мусор". В общем случае любая создаваемая вами не void-функция должна возвращать значение посредством явно выполняемой инструкции return.
Выше упоминалось, что void-функция может иметь несколько инструкций return. То же самое относится и к функциям, которые возвращают значения. Например, представленная в следующей программе функция find_substr() использует две инструкции return, которые позволяют упростить алгоритм ее работы. Эта функция выполняет поиск заданной подстроки в заданной строке. Она возвращает индекс первого обнаруженного вхождения заданной подстроки или значение -1, если заданная подстрока не была найдена. Например, если в строке "Я люблю C++ " необходимо отыскать подстроку "люблю", то функция find_substr() возвратит число 2 (которое представляет собой индекс символа "л" в строке "Я люблю C++ ").
#include <iostream>
using namespace std
int find_substr(char *sub, char *str);
int main()
{
int index;
index = find_substr("три", "один два три четыре");
cout << "Индекс равен " << index; // Индекс равен 9.
return 0;
}
// Функция возвращает индекс искомой подстроки или -1, если она не была найдена.
int find_substr(char *sub, char *str)
{
int t;
char *p, *p2;
for(t=0; str[t]; t++) {
p = &str[t]; // установка указателей
p2 = sub;
while(*p2 && *p2==*p) { // проверка совпадения
p++; p2++;
}
/* Если достигнут конец р2-строки (т.е. подстроки), то подстрока была найдена. */
if(!*p2) return t; // Возвращаем индекс подстроки.
}
return -1; // Подстрока не была обнаружена.
}
Результаты выполнения этой программы таковы.
Индекс равен 9
Поскольку искомая подстрока существует в заданной строке, выполняется первая инструкция return. В качестве упражнения измените программу так, чтобы ею выполнялся поиск подстроки, которая не является частью заданной строки. В этом случае функция find_substr() должна возвратить значение -1 (благодаря второй инструкции return).
Функцию можно объявить так, чтобы она возвращала значение любого типа данных, действительного для C++ (за исключением массива: функция не может возвратить массив). Способ объявления типа значения, возвращаемого функцией, аналогичен тому, который используется для объявления переменных: имени функции должен предшествовать спецификатор типа. Спецификатор типа сообщает компилятору, значение какого типа данных должна возвратить функция. Указываемый в объявлении функции тип должен быть совместимым с типом данных, используемым в инструкции return. В противном случае компилятор отреагирует сообщением об ошибке.