Образовательная поддержка

Студенту >> Язык программирования Си

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

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

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

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

Первый вызов FillArray() заполняет 40 первых элементов массива B значением 35.4, второй вызов заполняет 20 элементов массива B, начиная с элемента B[60], значением 15.4. При возврате из функции массив будет изменен, т. к. занесение значения val происходит непосредственно по нужному адресу.

Эту же функцию можно использовать для заполнения строк двумерного массива:

В примере следует обратить внимание на соответствие типов передаваемых параметров и на способ вычисления числа строк и числа столбцов двумерного массива.

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

При обращении к данной функции для параметров px и py нужно передавать адреса:

В данном примере при вызове функции создаются локальные копии адресов переменных x и y, а внутри функции происходит обращение к переменным x и y через их адреса (как и в случае массивов), поэтому значения x и y после вызова функции будут изменены.

Является ли оператор return обязательным для функций С++, которые не возвращают void?

Книга My Herb Schildt на С++ говорит: «. В С++, если функция объявлена ​​как возвращающая значение, она должна вернуть значение». Однако, если я пишу функцию с не-void возвращаемым типом и ничего не возвращаю, компилятор выдает предупреждение вместо ошибки: «Control достигает конца не-void-функции».

Я использую gcc (MinGW) и установил флаг -pedantic.

Вытекание конца функции эквивалентно возврату без значения; это приводит к поведению undefined в возвращающей значение функции.

Так что это зависит от вашего определения обязательного. Тебе обязательно? Нет. Но если вы хотите, чтобы ваша программа имела четко определенное поведение, да. *

* main является исключением, см. п. 3.3.1/5. Если элемент управления достигнет конца main без return , он будет иметь эффект return 0; .

Это обязательно — это поведение undefined, когда такая функция заканчивается, не возвращая ничего (поэтому компиляторы могут реально реализовать какое-то особое поведение). Однако есть некоторые особые случаи.

::main является исключением, предполагается, что return 0; находится в конце его кода.

Кроме того, вам не нужно возвращать значение в функции, которая не возвращается чисто, f.e.:

Не обязательно иметь оператор return в функции, объявленной как возвращающий не-void, и это не должно приводить к поведению undefined.

Такая функция могла:

  • Не возвращайся, скажем, введя бесконечный цикл
  • Возврат путем исключения исключения
  • Вызвать функцию, которая сама не возвращает, например std::terminate

Конечно, если функция избегает поведения undefined, всегда выполняя одно из указанных выше, вероятно, не должна быть объявлена ​​как возвращающая не-void, если это возможно.

Читайте так же:  Купить полис осаго с печатью в москве

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

Принцип действия функции return

Несколько return в функции
Что будет, если написать несколько ретурнов в функции? Например: int (int x.

return в функции потока
Куда возвращается значение, указанное в return функции созданного потока?

В чем разница между return и return false/true
Привет всем. Вот подскажите плиз) return; return false; return true; .

Не работает оператор return в рекурсивной функции
Писал курсач реализовать игру в калах. В коде в функции solve_computer() в 112.

Урок 12. Функции и return

Обновлено 3 Ноя 2018 |

Функция – это последовательность стейтментов, выполняющих определенное задание. Вы уже знаете, что каждая программа должна иметь функцию main() (с которой она и начинает своё выполнение). Тем не менее, большинство программ используют и много других функций.

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

Программы в C++ работают также. Иногда, когда программа выполняет код, она может столкнуться с вызовом функции (function call). Вызов функции – это выражение, которое указывает процессору прервать текущую функцию и выполнить другую. Процессор «оставляет закладку» в текущей точке выполнения, а затем вызывает (выполняет) определенную функцию. Когда выполнение вызываемой функции завершается, процессор возвращается к месту, где «осталась закладка» и возобновляет выполнение.

Функция, в которой находится вызов — называется caller, а функция, которую вызывают – callee (либо «вызываемая функция»).

Ниже приведен пример программы с вызовом функции:

Эта программа начинает выполнение с функции main() и первая строка выводит текст Starting main(). Вторая строка вызывает функцию doPrint(). На этом этапе выполнение инструкций в main() приостанавливается и процессор переходит к doPrint(). Первая (и единственная) строка в doPrint() выводит текст In doPrint(). Когда doPrint() завершает выполнение, caller (main ()) возобновляет выполнение с места остановки. Следовательно, следующая инструкция – вывод строки Ending main().

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

Правило: Не забывайте указывать скобки () при вызове функции.

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

Когда функция main() завершает своё выполнение, то она возвращает целочисленное значение обратно в операционную систему, используя стейтмент return.

Функции, которые вы пишете, также могут возвращать значения. Для этого нужно установить тип возвращаемого значения (или тип возврата). Он указывается при объявлении функции, перед её именем. Обратите внимание, тип возврата не указывает, какое конкретно значение будет возвращаться. Он указывает только, какого типа будет это значение.

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

Рассмотрим простую функцию, которая возвращает целочисленное значение:

Почему нужно возвращать значение обратно в операционную систему? Возвращаемое значение в main() – это код состояния и он сообщает операционной системе успешно ли выполнена программа. Обычно, возвращаемое значение 0 (нуль) означает успех, а любое другое — ошибку.

Читайте так же:  Образец договор мены земельных участков

Обратите внимание, по стандартам C++ функция main() должна возвращать целое число. Однако, если вы не укажете return в конце main(), то компилятор вернет 0 автоматически, если ошибок не будет. Но мы рекомендуем указывать return в main() и использовать тип возврата int для main().

Еще немного о возвращаемых значениях

Во-первых, если функция имеет тип возврата не void, то она должна возвращать значение указанного типа (через оператор return). Единственно исключение — функция main(), которая возвращает значение 0, если иное явно не предустановлено.

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

Функция может возвращать только одно значение через return обратно в caller. Это может быть одно число (например, 5), значение переменной или выражения (которое производит одно значение). Или же определенное значение из набора возможных значений.

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

Наконец, обратите внимание, функция может свободно определять, что означает её возвращаемое значение. Некоторые функции используют возвращаемые значения в качестве кодов состояния для указания результата выполнения (успешно или нет). Другие функции возвращают вычисленное или выбранное (из набора) значение. Еще другие функции ничего не возвращают. То, что функция возвращает, и значение этого значения — всё это определяется автором функции. Из-за большого разнообразия всего — было бы неплохо оставлять комментарии к собственным функциям, указывая не только, что они возвращают, но и что значат возвращаемые значения.

Повторное использование функций

Одну и ту же функцию можно вызывать несколько раз, что очень полезно.

Возврат значения из функции с++

Существует два вида передачи данных: по значению и по адресу.
Передача данных по значению проиходит так: формальному параметру присваивается значение фактического. После этого все опереаторы функции выполняются только над формальным параметром. Т.е. фактический параметр не изменится. Это есть int c.

Под формальным параметром я имею ввиду следующее (на данном примере):

Далее: при передаче данных по адресу в функцию передается не значение параметра, а его адрес. Сам адрес не меняется, но меняется переменная, расположенная по этому адресу. А это есть int &c.

Возврат значения из функции с++

Скажите, пожалуйста, есть ли какая-то видимая разница в работе 2-х функций?

С объектами классов я разобрался (про создание копий объектов, работу конструкторов копирования и деструкторов).

Как я понял, в func2 при возврате значения будет создаваться временная копия объекта и удаляться. В func1 этого происходить не будет.

Функции в языке Си

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

  • тип возвращаемого значения;
  • имя функции;
  • информация о формальных аргументах;
  • тело функции.

Определение функции имеет следующий синтаксис:

Пример : Функция сложения двух вещественных чисел

В указанном примере возвращаемое значение имеет тип float . В качестве возвращаемого значения в вызывающую функцию передается значение переменной y . Формальными аргументами являются значения переменных x и z .

Читайте так же:  Госпошлина в раменский суд

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

Различают системные (в составе систем программирования) и собственные функции.

Системные функции хранятся в стандартных библиотеках, и пользователю не нужно вдаваться в подробности их реализации. Достаточно знать лишь их сигнатуру. Примером системных функций, используемых ранее, являются функции printf() и scanf() .

Собственные функции — это функции, написанные пользователем для решения конкретной подзадачи.

Разбиение программ на функции дает следующие преимущества:

  • Функцию можно вызвать из различных мест программы, что позволяет избежать повторения программного кода.
  • Одну и ту же функцию можно использовать в разных программах.
  • Функции повышают уровень модульности программы и облегчают ее проектирование.
  • Использование функций облегчает чтение и понимание программы и ускоряет поиск и исправление ошибок.

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

Общий вид вызова функции

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

Возврат в вызывающую функцию

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

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

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

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

Пример : Посчитать сумму двух чисел.

В языке Си нельзя определять одну функцию внутри другой.

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

  • тип возвращаемого значения;
  • имя функции;
  • типы формальных аргументов в порядке их следования.

Прототип необходим для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических аргументов типам формальных аргументов. Имена формальных аргументов в прототипе функции могут отсутствовать.

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

Рекурсивные функции

Функция, которая вызывает сама себя, называется рекурсивной функцией .

Рекурсия — вызов функции из самой функции.

Пример рекурсивной функции — функция вычисления факториала.