если в функции на языке с отсутствует оператор return то такая функция
Электроника для всех
Блог о электронике
1.4.11. Оператор return
Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию, в точку, непосредственно следующую за вызовом. Функция main передает управление операционной системе. Формат оператора:
Значение выражения, если оно задано, возвращается в вызывающую функцию в качестве значения вызываемой функции. Если выражение опущено, то возвращаемое значение не определено. Выражение может быть заключено в круглые скобки, хотя их наличие не обязательно.
Если в какой-либо функции отсутствует оператор return, то передача управления в вызывающую функцию происходит после выполнения последнего оператора вызываемой функции. При этом возвращаемое значение не определено. Если функция не должна иметь возвращаемого значения, то ее нужно объявлять с типом void.
Таким образом, использование оператора return необходимо либо для немедленного выхода из функции, либо для передачи возвращаемого значения.
int sum (int a, int b)
Функция sum имеет два формальных параметра a и b типа int, и возвращает значение типа int, о чем говорит описатель, стоящий перед именем функции. Возвращаемое оператором return значение равно сумме фактических параметров.
В этом примере оператор return используется для выхода из функции в случае выполнения одного из проверяемых условий.
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.
C++. Функции. Передача параметров. Оператор return
Из данной статьи Вы узнаете о передаче параметров в функцию и о возврате результата с помощью оператора return. Рассмотрим теоретический материал.
Передача параметров в функцию
Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров. Список_переменных, указанный в заголовке функции называется формальными параметрами или просто параметрами функции. Список_переменных в операторе вызова функции — это фактические параметры или аргументы.
Передача параметров выполняется следующим образом. Вычисляются выражения, стоящие на месте фактических параметров. Затем формальным параметрам присваиваются значения фактических. Выполняется проверка типов и при необходимости выполняется их преобразование.
Передача параметров в функцию может осуществляться по значению и по адресу.
При передачи данных по значению функция работает с копиями фактических параметров, и доступна к исходным значениям аргументов у нее нет. При передачи по адресу в функцию передается не переменная, а ее адрес, и, следовательно, функция имеет доступ к ячейкам памяти, в которых хранятся аргументов. Таким образом, данные, переданные по значению, функция изменить не может, в отличие от данных, переданных по адресу.
Если требуется запретить изменение параметра внутри функции, используют модификатор const. Заголовок функции в общем виде будет выглядеть так:
Урок №12. Функции и оператор возврата return
Обновл. 11 Сен 2021 |
Вы уже знаете, что каждая программа должна содержать функцию main() (с которой она и начинает свое выполнение). Тем не менее, большинство программ используют и много других функций.
Функции
Функция — это последовательность стейтментов для выполнения определенного задания. Часто ваши программы будут прерывать выполнение одних функций ради выполнения других. Вы делаете аналогичные вещи в реальной жизни постоянно. Например, вы читаете книгу и вспомнили, что должны были сделать телефонный звонок. Вы оставляете закладку в своей книге, берете телефон и набираете номер. После того, как вы уже поговорили, вы возвращаетесь к чтению: к той странице, на которой остановились.
Программы на языке C++ работают похожим образом. Иногда, когда программа выполняет код, она может столкнуться с вызовом функции. Вызов функции — это выражение, которое указывает процессору прервать выполнение текущей функции и приступить к выполнению другой функции. Процессор «оставляет закладку» в текущей точке выполнения, а затем выполняет вызываемую функцию. Когда выполнение вызываемой функции завершено, процессор возвращается к закладке и возобновляет выполнение прерванной функции.
Функция, в которой находится вызов, называется caller, а функция, которую вызывают — вызываемая функция, например:
Результат выполнения программы:
Starting main()
In doPrint()
Ending main()
Правило: Не забывайте указывать круглые скобки () при вызове функций.
Возвращаемые значения
Когда функция main() завершает свое выполнение, она возвращает целочисленное значение обратно в операционную систему, используя оператор return.
Функции, которые мы пишем, также могут возвращать значения. Для этого нужно указать тип возвращаемого значения (или «тип возврата»). Он указывается при объявлении функции, перед её именем. Обратите внимание, тип возврата не указывает, какое именно значение будет возвращаться. Он указывает только тип этого значения.
Затем, внутри вызываемой функции, мы используем оператор return, чтобы указать возвращаемое значение — какое именно значение будет возвращаться обратно в caller.
Рассмотрим простую функцию, которая возвращает целочисленное значение:
Результат выполнения программы:
Первый вызов функции return7() возвращает 7 обратно в caller, которое затем передается в std::cout для вывода.
Третий вызов функции return7() опять возвращает 7 обратно в caller. Однако функция main() ничего с ним не делает, поэтому ничего и не происходит (возвращаемое значение игнорируется).
Примечание: Возвращаемые значения не выводятся на экран, если их не передать объекту std::cout. В последнем вызове функции return7() значение не отправляется в std::cout, поэтому ничего и не происходит.
Тип возврата void
Функции могут и не возвращать значения. Чтобы сообщить компилятору, что функция не возвращает значение, нужно использовать тип возврата void. Взглянем еще раз на функцию doPrint() из вышеприведенного примера:
Эта функция имеет тип возврата void, который означает, что функция не возвращает значения. Поскольку значение не возвращается, то и оператор return не требуется.
Вот еще один пример использования функции типа void:
Второй вызов функции returnNothing() даже не скомпилируется. Функция returnNothing() имеет тип возврата void, который означает, что эта функция не возвращает значения. Однако функция main() пытается отправить это значение (которое не возвращается) в std::cout для вывода. std::cout не может обработать этот случай, так как значения на вывод не предоставлено. Следовательно, компилятор выдаст ошибку. Вам нужно будет закомментировать эту строку, чтобы компиляция прошла успешно.
Возврат значений функцией main()
Почему нужно возвращать значения обратно в операционную систему? Дело в том, что возвращаемое значение функции main() является кодом состояния, который сообщает операционной системе об успешном или неудачном выполнении программы. Обычно, возвращаемое значение 0 (ноль) означает что всё прошло успешно, тогда как любое другое значение означает неудачу/ошибку.
Обратите внимание, по стандартам языка C++ функция main() должна возвращать целочисленное значение. Однако, если вы не укажете return в конце функции main(), компилятор возвратит 0 автоматически, если никаких ошибок не будет. Но рекомендуется указывать return в конце функции main() и использовать тип возврата int для функции main().
Еще о возвращаемых значениях
Во-вторых, когда процессор встречает в функции оператор return, он немедленно выполняет возврат значения обратно в caller и точка выполнения также переходит в caller. Любой код, который находится за оператором return в функции — игнорируется.
Функция может возвращать только одно значение через return обратно в caller. Это может быть либо число (например, 7 ), либо значение переменной, либо выражение (у которого есть результат), либо определенное значение из набора возможных значений.
Но есть способы обойти правило возврата одного значения, возвращая сразу несколько значений, но об этом детально мы поговорим на соответствующем уроке.
Наконец, автор функции решает, что означает её возвращаемое значение. Некоторые функции используют возвращаемые значения в качестве кодов состояния для указания результата выполнения функции (успешно ли выполнение или нет). Другие функции возвращают определенное значение из набора возможных значений. Кроме того, существуют функции, которые вообще ничего не возвращают.
Повторное использование функций
Одну и ту же функцию можно вызывать несколько раз, даже в разных программах, что очень полезно:
Если в функции на языке с отсутствует оператор return то такая функция
Операторы программы на языке С управляют процессом ее выполнения. В языке С, как и в других языках программирования, имеется ряд операторов, с помощью которых можно выполнять циклы, указывать другие операторы для выполнения и передавать управление на другой участок программы. Данная Глава рассматривает операторы языка С в алфавитном порядке:
Операторы языка С состоят из ключевых слов, выражений и других операторов. В операторах языка С появляются следующие ключевые слова:
Выражения в операторах языка С это те выражения, которые рассматривались Главе «Выражения и присвоения». Операторы, которые могут появляться в операторах языка С, это могут быть любые рассматриваемые в данной Главе операторы. операторы, которые формируют компоненту другого оператора называются «телом» вложенного оператора. Часто телом оператора является «составной» оператор: отдельный оператор, состоящий из одного или нескольких операторов. Составные операторы ограничиваются фигурными скобками (<>). Все другие операторы языка С заканчиваются точкой с запятой (;). Любой оператор языка С может начинаться с идентифицирующей его метки, которая состоит из имени и двоеточия. Метки операторов распознаются только оператором goto, поэтому рассмотрены вместе с оператором goto в Разделе 6.8. При выполнении программы на языке С ее операторы выполняются в том порядке, в котором они появляются в программе, если нет оператора, который бы явно передавал управление в другое место программы.
Выполнение Оператор break прекращает выполнение вложенного оператора do, for, switch или while, в котором он появляется. Управление передается тому оператору, который непосредственно следует за прерванным оператором. Оператор break может появиться только в операторах do, for, switch или while. Для вложенных операторов оператор break прекращает выполнение только оператора do, for, switch или while, в котором он появился. Для передачи управления из вложенной структуры можно использовать оператор return или goto. Пример В данном примере обрабатывается массив строк переменной длины, хранимый в lines. Оператор break вызывает выход из внутреннего цикла for после обнаружения ограничительного пустого символа (\ 0) в каждой строке и его позиция записывается в lengths[i]. Затем управление передается на внешний цикл for. Переменная i увеличивается и процесс продолжается до тех пор, пока i не станет больше или равна LENGTH.
Составной оператор
Выполнение Составной оператор обычно появляется как тело другого оператора, например, оператора if. При выполнении составного оператора его операторы выполняются в том порядке, в котором они появляются, если не встретится оператор, который явно передает управление в другое место программы. Глава «Объявление» описывает формы и назначения объявлений, которые могут появиться в начале составного оператора. Подобно другим операторам языка С, любые операторы составного оператора могут иметь метки. Операторы с метками рассматриваются в Разделе 6.8. Пример В данном примере, если i больше 0, то последовательно выполняются все операторы составного оператора.
Оператор continue
Выполнение Оператор continue передает управление на следующую итерацию оператора do, for или while, в котором он появляется передавая все оставшиеся операторы тела оператора do, for или while. Следующая итерация оператора do, for или while понимается следующим образом:
В операторе do или while следующая итерация начинается вычислением выражения оператора do или while.
В операторе for следующая итерация начинается вычислением выражения цикла оператора for. После вычисления условного выражения в зависимости от его результатов происходит либо прекращение выполнения оператора либо выполнение его тела. (Оператор for рассматривается в Разделе 6.7.)
Пример В данном примере тело оператора будет выполнено, если i больше 0. Сначала f(i) присваивается x, затем, если x=1, выполняется оператор continue. Остальные операторы тела игнорируются и выполнение переходит в начало цикла на вычисление i-\,->0.
Оператор do
Выполнение Тело оператора do выполняется один или несколько раз до тех пор, пока значением выражения не станет «ложь» (0). Выполнение происходит следующим образом:
Выполняется тело оператора.
Вычисляется выражение. Если его значение «ложь», то выполнение оператора do заканчивается и управление передается следующему оператору программы. Если его значение «истина» (ненулевое значение), то процесс повторяется, начиная с шага 1.
Выполнение оператора do может быть прервано выполнением оператора break, goto или return в теле оператора do. Пример В данном операторе do независимо от значения x выполняются два оператора, y=f(x); и x-\,-;. Затем вычисляется значение x>0. Если x больше 0, то тело цикла выполняется снова и опять проверяется x>0. Тело оператора выполняется повторно до тех пор, пока x остается больше 0. Выполнение оператора do прекращается, когда значение x становится 0 или отрицательным. Тело цикла выполнится по крайней мере один раз.
Оператор-выражение
Выполнение При выполнении оператора-выражения, выражение вычисляется в соответствии с правилами, приведенными в Главе «Выражения и присвоения». В языке С присвоения являются выражениями. Значением выражения в этом случае будет присваиваемое значение (иногда называемое «правым значением»). Вызовы функций также считаются выражениями. В этом случае значением выражения будет возвращаемая функцией величина, если она имеется. Если функция возвращает значение, то оператор-выражение обычно содержит присвоение для записи возвращаемого значения при вызове функции. Возвращаемое функцией значение обычно используется в качестве операнда в другом выражении. Если значение будет использовано несколько раз, его можно присвоить другой переменной. Если значение не будет использовано в качестве операнда и не будет присвоено, то функция вызывается, а возвращаемое значение, если оно есть, не используется. Пример 1 В данном примере x присваивается значение y+3.
Пример 2 В данном примере увеличивается значение x.
Пример 3 В данном примере показано выражение вызова функции. Значение выражения, которое включает в себя любую возвращаемую функцией величину, будет присвоено переменной z.
Оператор for
Выполнение Тело оператора for может выполниться несколько раз, а может не выполниться ни разу, пока значением необязательного условного-выражения не станет «ложь». Можно использовать необязательные начальное-выражение и выражение-цикла для инициализации и смены значений при выполнении операторов for. Выполнение оператора for происходит следующим образом:
Вычисляется начальное-выражение, если оно есть.
Вычисляется условное-выражение, если оно есть. Возможны три результата:
Если значение условного-выражения «истина» (ненулевое), то выполняется оператор. Затем вычисляется выражение-цикла, если оно есть. Процесс начинается снова с вычисления условного-выражения.
Если условное-выражение опущено, то считается, что его значение «истина» и процесс выполнения протекает так, как это описано в первом случае. Оператор for без аргумента условного-выражения прекращает свое выполнение только в случае выполнения оператора break или return в теле оператора, или при выполнении оператора goto (который передаст управление на оператор с меткой вне тела оператора for).
Если значение условного-выражения «ложь», то выполнение оператора for прекращается и управление передается к следующему оператору программы.
Оператор for также прекращает свое выполнение при выполнении в теле оператора оператора break, goto или return. Пример В данном примере происходит подсчет количества символов пробела (‘\ x20’) и табуляции (‘\ t’) в массиве символов с именем line, и каждый символ табуляции заменяется пробелом. Сначала i, space и tab инициализируются значением 0. Затем i сравнивается с константой MAX; если i меньше MAX, то выполняется тело оператора. В зависимости от значения line[i] тело оператора if будет выполнено один раз или не выполнено совсем. Затем i увеличивается и снова сравнивается с MAX. Тело оператора будет выполняться повторно до тех пор, пока i остается меньше MAX.
Оператор goto и операторы с метками
Выполнение Оператор goto передает управление непосредственно на оператор, который имеет своей меткой «имя». Оператор сметкой будет выполнен сразу после выполнения оператора goto. Оператор с заданной меткой должен находиться в той же самой функции и заданная метка может помечать только один оператор в данной функции. Метка оператора имеет смысл только для оператора goto. В любом другом контексте оператор с меткой выполняется так, как если бы ее вообще не было. Имя метки это просто идентификатор. (Правила построения идентификаторов приведены в Разделе 2.4.) Каждая метка оператора должно отличаться от других меток операторов в данной функции. Подобно другим операторам языка С любой из операторов составного оператора может иметь метку. Следовательно, можно использовать оператор goto для передачи управления составному оператору. Однако, есть опасность в передаче управления составному оператору, т.к. он может содержать объявления, которые инициализируют переменные. Т.к. объявления появляются до выполняемых операторов в составном операторе, то передача управления непосредственно на выполняемый оператор составного оператора обойдет инициализацию. Результаты будут неопределенными. Пример В данном примере оператор goto передает управление на точку с меткой exit, если появляется ошибка.
Оператор if
Выполнение Тело оператора if выполняется выборочно, в зависимости от значения выражения, по следующей схеме:
Вычисляется значение выражения.
Если значение выражения «истина» (не ноль), то выполняется оператор1.
Если значение выражения «ложь», то выполняется оператор2.
Если значение выражения «ложь» и не задана статья else, то оператор1 игнорируется.
Управление передается от оператора if на следующий оператор программы.
Пример 1 В данном примере если i больше нуля, то выполняется оператор y=x/i. Если i меньше или равно нулю, то значение i присваивается x и y присваивается значение f(x). Обратите внимание на то, что формирующий предложение if оператор заканчивается точкой с запятой.
Примечание В языке С отсутствует оператор «else if», но этого же эффекта можно достигнуть вложенными операторами if. Оператор if может быть вложен либо в предложение if, либо в предложение else другого оператора if. При вложении операторов if и предложений else следует использовать скобки для группировки операторов и предложений в составные операторы, что проясняет Ваши намерения. Если скобки не задать, то компилятор попытается разрешить конфликт сам, группируя каждый else с наиболее близким к нему if, у которого else отсутствует. Пример 2 В данном примере предложение else связывается с внутренним оператором if. Если i меньше или равно 0, то никакое значение x не присваивается.
Пример 3 В данном примере сковки окружают внутренний оператор if. В результате этого статья else становится частью внешнего оператора if. Если i меньше или равно 0, то значение i присваивается x.
Пустой оператор
«Пустой оператор» это оператор, который состоит только из точки с запятой. Он может появиться везде, где ожидается появление оператора. При выполнении пустого оператора ничего не происходит. Операторы подобные do, for, if и while требуют наличия выполняемого оператора в теле оператора. В данном случае пустой оператор удовлетворяет синтаксическим требованиям, если действительно не нужно иметь выполняемое тело оператора. Как и любых других операторах языка С, перед пустым оператором можно ставить метку. Для того, чтобы пометить меткой элемент, который не является оператором, например, закрывающую скобку составного оператора, можно пометить меткой пустой оператор и поместить его непосредственно перед нужным элементом. Пример В данном примере выражение цикла line[i++]=0 в цикле for инициализирует первые 10 элементов line значением 0. Телом оператора является пустой оператор, т.к. не нужно никаких дополнительных операторов.
Оператор return
Выполнение Оператор return прекращает выполнение функции, в которой он появляется и передает управление на вызов функции. Выполнение программы продолжается непосредственно с той точки, откуда был произведен вызов функции. Значение выражения, если оно есть, передается на вызов функции. Если выражение не задано, то возвращаемое функцией значение не определено. По общему соглашению аргумент «выражение» оператора return заключается в скобки. Однако, для языка С присутствие этих скобок необязательно. Если в определении функции отсутствует оператор return, то управление автоматически передается на вызов функции после выполнения последнего оператора вызванной функции. При этом не определено возвращаемое вызванной функцией значение. Если от функции не требуется возврат какого-либо значения, то функция объявляется с возвращаемым значением типа void. Пример В данном примере функция main вызывает две функции: sq и draw. Функция sq возвращает в функцию main значение x*x, где оно присваивается y. Функция draw не возвращает значение и объявлена типом void. Попытка присвоения возвращаемого функцией draw значения вызовет появление диагностического сообщения.
Оператор switch
Выполнение Оператор switch передает управление на оператор в своем теле. Управление будет передано тому оператору, значение case постоянное-выражение которого совпадает с выражением switch. Оператор switch может содержать любое число элементов case. Выполнение тела оператора начинается в выбранном операторе и заканчивается в конце тела или в тот момент, когда оператор передаст управление вне тела. Оператор default выполняется в том случае, если ни одно постоянное-выражение case которого не совпадет с выражением switch. Если оператор default не задан и ни одно совпадение с case не обнаружено, то ни один из операторов тела switch не будет выполнен. Располагать оператор default в конце не обязательно, он может появиться в произвольном месте тела оператора switch. Выражение switch должно иметь интегральный тип, но результирующее значение будет преобразовано в int. Затем каждое постоянное-выражение case будет преобразовано с использованием обычных арифметических преобразований. Значения всех постоянных-выражений case должны быть разными в теле оператора. если тип выражения switch больше int, то появится диагностическое сообщение. Метки case и default тела оператора switch действуют только при первоначальной проверке, определяющей начало выполнения тела цикла. Все операторы от начала выполнения и до конца тела выполняются независимо от их меток, кроме случая, когда управление передается в часть программы вне тела оператора. Примечание В начале составного оператора, формирующего тело switch, могут появиться объявления, но сделанные в объявлениях инициализации не выполняются. Оператор switch передает управление непосредственно на выполняемый оператор тела, передавая ему строки, содержащие инициализации. Пример 1 В данном примере будут выполнены все три оператора тела switch, если c равно A. При этом управление передается на первый оператор (capa++;) и продолжается до конца тела. Если c равно a, то значения lettera и total увеличиваются. В противном случае будет увеличено только значение total.
Использование нескольких меток На один оператор может указывать несколько меток case, как это показано в следующем примере:
Хотя можно поставить метку на любой оператор тела оператора switch, в качестве носителя метки необязательно должен быть оператор. Можно свободно ставить операторы с метками и без меток. Однако, следует помнить о том, что после того, как оператор switch передаст управление на какой-либо оператор тела, будут выполнены все операторы блока, независимо от того, имеют ли они метки или нет.
Оператор while
Выполнение Тело оператора while выполнится ноль или более раз до тех пор, пока значением выражения не станет «ложь» (0). Процесс выполнения протекает следующим образом:
Вычисляется значение выражения.
Если значение выражения есть «ложь», то тело оператора while не выполняется, и управление передается на следующий за оператором while оператор программы. Если значение выражения есть «истина» (не ноль), то выполняется тело оператора и процесс повторяется с шага 1.
Выполнение оператора while также может быть закончено выполнением оператора break, goto или return в теле оператора. Пример В данном примере символы string2 копируются в string1. Если i больше или равно 0, то string2[i] присваивается string1[i] и значение i уменьшается. Когда достигнет значения 0 или упадет ниже него, выполнение оператора while заканчивается.