Как вернуть значение из функции c
Перейти к содержимому

Как вернуть значение из функции c

  • автор:

Как вернуть значение из функции c

Для возвращения результата из функции применяется оператор return . Этот оператор имеет две формы:

return выражение; return;

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

Единственная функция, которая возвращает некоторое значение, и где можно не использовать оператор return — это функция main .

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

#include #include int sum(int, int); int main() < int result = sum(10, 6); // 16 std::cout int sum(int n, int m)

Здесь функция sum, которая вычисляет сумму чисел, принимает два значения типа int и возвращает значение типа int , поэтому прототип функции выглядит следующим образом

int sum(int, int);

И в этом случае в функции sum необходимо использовать оператор return , после которого идет возвращаемое значение:

int res = n + m; return res;

В данном случае возвращается значение переменной res . Хотя это могло бы быть сложное выражение, которое возвращало число int, например:

int sum(int n, int m)

Так как функция sum возвращает значение, то ее результат можно присвоить какой-нибудь переменной или константе:

int result = sum(10, 6); // 16 std::cout 

Либо напрямую использовать результат функции sum, как число, например, при выводе на консоль:

std::cout 

Рассмотрим еще один пример:

#include int calculate(int, int, char); int main() < std::cout int calculate(int n, int m, char op) < switch(op) < case '+': return n + m; case '-': return n - m; case '*': return n * m; default: return 0; >>

Здесь определена функция calculate , которая также принимает два числа и символ - знак операции. В конструкции switch в зависимости от знака операции с помощью оператора return возвращается результат определенной операции

return без возвращения значения

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

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

#include #include void print(std::string, unsigned); int main() < print("Tom", 38); // Name: Tom Age: 38 print("Bob", 2500); // Incorrect age >void print(std::string name, unsigned age) < // если запредельный возраст if(age >120) < std::cout std::cout

Здесь в функции print проверяем переданный возраст. И если он представляет недопустимое значение, то с помощью оператора return осуществляем выход из функции.

Выведение типа результата

Компилятор С++ может автоматически выводить тип возвращаемого значения, если вместо возвращаемого типу используется оператор auto :

#include // автоматически выводится возвращаемый тип auto sum(int a, int b) < return a + b; >int main() < std::cout 

Здесь тип результата в функции sum выводится автоматически. Поскольку возвращется сумма a + b , результат которой будет представлять тип int , соответственно компилятор выведет, что функция возвращает тип int. Стоит отметить, что функция sum определена до того, как она вызывается в функции main.

В данном случае нет большого смысла использовать оператор auto вместо int . Обычно auto применяется, если название возвращаемого типа довольно большое и сложное, что позволит сократить код.

Возвращаемые значения

Все функции, кроме функций типа void, возвращают значения. Данное значение определяется в операторе return. Если функция не определена как void и если не указано возвращаемое значение, то возвращается мусор. Если функция не объявлена как void, она может использоваться в качестве операнда в любом корректном выражении. Следовательно, каждое из следующих выражений корректно:

if (max (х, у) > 100) printf ("greater");

for (ch=getchar(); isdigit(ch); ) . ;

Тем не менее функция не может стоять с левой стороны оператора присваивания. Оператор типа

swap (х, у) = 100; /* некорректный оператор */

неправилен. Компилятор выдаст ошибку.

Если функция объявляется как void, она не может использоваться в выражениях. Например, предположим, что f() объявлена как void. Следующие операторы не будут компилироваться:

int t;
t = f(); /* нет значения для присваивания t */
f() + f(); /* нет значений для сложения */

Хотя все функции не типа void имеют значения возврата, при написании программ обычно используется три типа функций. Первый тип - это вычислительные функции. Он предназначен для выполнения операций с аргументами и возвращает значение, основываясь на этих операциях. Примером таких функций являются sqr() и sin() - стандартные библиотечные функции.

Следующий тип функций обрабатывает информацию и возвращает значение, показывающее, была ли работа успешной или привела к ошибке. Примером является fwrite() - функция, используемая для записи информации в файл. Если запись проведена успешно, fwrite() возвращает число удачно записанных элементов. Если возникла ошибка, возвращаемое число не равно числу элементов, которые требовалось записать.

Последний тип функций не имеет определенного возвращаемого значения. Функция является обычной процедурой и не выдает значения. Примером служит srand(), используемая для инициализации генератора случайных чисел функции rand(). Иногда функции, не выдающие осмысленного результата, что-то все-таки выдают. Например, printf() возвращает число напечатанных символов. Очень трудно найти программу, которая проверяет это. Следовательно, хотя все функции, кроме функций, объявленных как void, возвращают значения, нет необходимости использовать все эти значения. Типичным вопросом по возвращаемым функциями значениям является: «Не должен ли я присвоить данное значение некоторой переменной, поскольку значение возвращается?» Ответ: «Нет». Если не указано, чему присваивается возвращаемое значение, то оно просто отбрасывается. Рассмотрим следующую программу, использующую mul():

int mul(int a, int b);

int main(void)
int x, y, z;
x = 10; у = 20;
z = mul(x, у); /* 1 */
printf ("%d", mul(x, y) ); /* 2 */
mul (x, y); /* 3 */
return 0;
>

int mul (int a, int b)
return a*b;
>

Строка 1 присваивает возвращаемое функцией mul() значение переменной z. В строке 2 возвращаемое значение напрямую не используется, но оно используется косвенно функцией printf(). Наконец, в строке 3 возвращаемое значение теряется, поскольку не происходит присваивание значения какой-либо переменной и также оно не используется ни в каком из выражений.

Как вернуть сразу 2 значения из функции?

Как вернуть сразу 2 значения массива в функции?
Собственно дан у меня например массив "aa", где l-левая граница, а r-правая. При выполнении кода.

Как вернуть 2 значения из функции?
Добрый день. У меня такой вопрос - как в этой проге можно вернуть 2 значения из функции? #include.

Как вернуть из функции два значения?
Подскажите,как вернуть из ф-ции 2 значения .Вроде ,как то можно с помощью pair ,но как здесь это.

Как вернуть два значения из функции?
Ребят, нужно вернуть из функции два значения. Подскажите как. Без массива public double.

Почетный модератор
7391 / 2637 / 281
Регистрация: 29.07.2006
Сообщений: 13,696

Пусть тогда адрес памяти возвращает, на массив, например. А в идеале один параметр можно вернуть через принятые параметры.

Регистрация: 27.03.2008
Сообщений: 75

"А в идеале один параметр можно вернуть через принятые параметры."

Почетный модератор
7391 / 2637 / 281
Регистрация: 29.07.2006
Сообщений: 13,696

а это тебе его достаточно передать по указателю. тогда изменив его значение в функции оно изменится и везде. Это же указатели. Читай.

Регистрация: 27.03.2008
Сообщений: 75
угу, спасибо!

Эксперт С++

2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
А язык какой?
На C++ - запросто Возвращаешь std :: pair .
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
можно записать их в структуру и вернуть её (структуры можно возвращать как есть, без указателей)

Эксперт С++

1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,819
Записей в блоге: 1
Вот пример

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void foo(const int inp, int &outx, int &outy, int &outz) { outx = inp + 10; outy = inp + 20; outz = inp + 30; } int main() { int x,y,z; foo(10,x,y,z); std::cout"x = "xstd::endl "y = "ystd::endl "z = "zstd::endl; return 0; }

А вобче Vourhey прав.
Регистрация: 04.02.2009
Сообщений: 5

ЦитатаСообщение от Vourhey Посмотреть сообщение

а это тебе его достаточно передать по указателю. тогда изменив его значение в функции оно изменится и везде. Это же указатели. Читай.

Ну или с помощью ссылок
Регистрация: 27.03.2008
Сообщений: 75

Спасибо всем огромное! А язык Си

Добавлено через 33 минуты 32 секунды
а можно попросить привести пример со структурами?
Саму структуру, которую потом функция вернуть должна, в функции задавать надо? Или можно вне функции?

Почетный модератор
7391 / 2637 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
А можно попросить попробовать самому пример сделать? Разве, это так сложно?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
struct pair { int a, b; }; struct pair return_pair(int c, int d) { struct pair tmp = {c*2, d*2}; return tmp; } int main(int argc, char **argv) { struct pair a = return_pair(1,2); printf("A = %d, B = %d\n", a.a, a.b); return 0; }

4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570

Саму структуру, которую потом функция вернуть должна, в функции задавать надо? Или можно вне функции?

структуру нужно объявлять вне всех функций потому что у функции должен быть возвращаемый тип структура (чтобы он был виден когда функция определяется как возвращающая такой-то тип), структура может хранить значения различных типов, в этом её плюс

#include struct x < int a, b; >; /* возвращает несколько переменных из функции в структуре */ main() < struct x f(int, int); printf("%d %d\n", f(5, 1).a, f(1, 8).b); return 0; >struct x f(int a, int b) < struct x tmp = < a*2, b*2 >; return tmp; >

операции идут () [] -> . слева направо, то есть сначала вычисляются скобки а потом точка, возвращение структуры введено в стандарте ANSI(89); возвращать можно структуру, а можно указатель на структуру, это различается в том плане, что когда возвращаешь структуру она вся копируется (то есть все её элементы), а когда указатель то копируется просто адрес. Так как возвращать адрес автоматической структуры нельзя, потому что она разрушается после работы функции, можно создать статическую структуру внутри функции.

#include struct x < int a, b; >; main() < struct x *f(int, int); printf("%d %d\n", f(5, 1)->a, f(1, 8)->b); return 0; > struct x *f(int a, int b)

статическую структуру нельзя инициализировать неконстантами (переменными то есть), и ещё она инициализируется только один раз, в момент создания, то есть чтобы придавать ей новые значения каждый раз, нужно присваивать их вне инициализации (инициализация - присваивание значения прямо в объявлении)
короче если у тебя структуры содержат немало данных, нужно юзать указатели, если мало, то можно прямо передавать (передавать можно в обе стороны)

Возврат значений из функции. Оператор return

Функции могут передавать какие-либо данные из своих тел в основную ветку программы. Говорят, что функция возвращает значение. В большинстве языков программирования, в том числе Python, выход из функции и передача данных в то место, откуда она была вызвана, выполняется оператором return .

Если интерпретатор Питона, выполняя тело функции, встречает return , то он "забирает" значение, указанное после этой команды, и "уходит" из функции.

def cylinder(): r = float(input()) h = float(input()) # площадь боковой поверхности цилиндра: side = 2 * 3.14 * r * h # площадь одного основания цилиндра: circle = 3.14 * r**2 # полная площадь цилиндра: full = side + 2 * circle return full square = cylinder() print(square)
3 7 188.4

В данной программе в основную ветку из функции возвращается значение локальной переменной full . Не сама переменная, а ее значение, в данном случае – какое-либо число, полученное в результате вычисления площади цилиндра.

В основной ветке программы это значение присваивается глобальной переменной square . То есть выражение square = cylinder() выполняется так:

  1. Вызывается функция cylinder() .
  2. Из нее возвращается значение.
  3. Это значение присваивается переменной square .

Не обязательно присваивать результат переменной, его можно сразу вывести на экран:

. print(cylinder())

Здесь число, полученное из cylinder() , непосредственно передается функции print() . Если мы в программе просто напишем cylinder() , не присвоив полученные данные переменной или не передав их куда-либо дальше, то эти данные будут потеряны. Но синтаксической ошибки не будет.

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

def cylinder(): try: r = float(input()) h = float(input()) except ValueError: return side = 2 * 3.14 * r * h circle = 3.14 * r**2 full = side + 2 * circle return full print(cylinder())

Если попытаться вместо цифр ввести буквы, то сработает return , вложенный в except . Он завершит выполнение функции, так что все нижеследующие вычисления, в том числе return full , будут опущены. Пример выполнения:

r None

Но постойте! Что это за слово None , которое нам вернул "пустой" return ? Это ничего, такой объект – "ничто". Он принадлежит классу NoneType . До этого мы знали четыре типа данных, они же четыре класса: int , float , str , bool . Пришло время пятого.

Когда после return ничего не указывается, то по умолчанию считается, что там стоит объект None . При желании мы можете явно писать return None .

Более того. Ранее мы рассматривали функции, которые вроде бы не возвращали никакого значения, потому что в них не было оператора return . На самом деле возвращали, просто мы не обращали на него внимание, не присваивали никакой переменной и не выводили на экран. В Python всякая функция что-либо возвращает. Если в ней нет оператора return , то она возвращает None . То же самое, как если в ней имеется "пустой" return .

Возврат нескольких значений

В Питоне позволительно возвращать из функции несколько объектов, перечислив их через запятую после команды return :

def cylinder(): r = float(input()) h = float(input()) side = 2 * 3.14 * r * h circle = 3.14 * r ** 2 full = side + 2 * circle return side, full s_cyl, f_cyl = cylinder() print("Площадь боковой поверхности %.2f" % s_cyl) print("Полная площадь %.2f" % f_cyl)

Из функции cylinder() возвращаются два значения. Первое из них присваивается переменной s_cyl , второе – f_cyl . Возможность такого группового присвоения – особенность Python, обычно не характерная для других языков:

>>> a, b, c = 10, 15, 19 >>> a 10 >>> b 15 >>> c 19

Фокус здесь в том, что перечисление значений через запятую (например, 10, 15, 19 ) создает объект типа tuple . На русский переводится как "кортеж". Это разновидность структур данных, которые будут изучены позже.

Когда же кортеж присваивается сразу нескольким переменным, то происходит сопоставление его элементов соответствующим в очереди переменным. Это называется распаковкой.

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

Распаковка не является обязательной. Будет работать и так:

print(cylinder())
4 3 (75.36, 175.84)

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

Практическая работа

  1. Напишите программу, в которой вызывается функция, запрашивающая с ввода две строки и возвращающая в программу результат их конкатенации. Выведите результат на экран.
  2. Напишите функцию, которая считывает с клавиатуры числа и перемножает их до тех пор, пока не будет введен 0. Функция должна возвращать полученное произведение. Вызовите функцию и выведите на экран результат ее работы.

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *