Как выйти из метода c
Перейти к содержимому

Как выйти из метода c

  • автор:

Выход из функции

Имеется два способа окончания работы функции и передачи управления вызывающему коду. Первый способ предполагает достижение последнего оператора функции, после чего работа функции заканчивается при встрече >. (Конечно, фигурной скобки на самом деле нет в объектном коде, но никто не мешает нам так думать.) Например, следующая функция выводит на экран строку:

void pr_reverse(char *s)
register int t;
for(t=strlen(s) -1; t > -1; t-) printf («%c», s [t]);
>

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

Тем не менее, не многие функции используют данный метод окончания своего выполнения. Большинство функций используют оператор return для окончания выполнения с целью возврата значения или упрощения кода функции и увеличения его эффективности путем создания нескольких точек выхода. Важно запомнить, что функция может иметь несколько операторов return. Например, функция, показанная ниже, возвращает или индекс первого появления подстроки, указываемой в s1, в строке, указываемой в s2, или —1, если не обнаружено совпадений:

int find_substr (char *s1, char *s2)
register int t;
char *p, *p2;
for(t=0; s1[t]; t++)
p = &s1[t];
p2 = s2;
while (*p2 && *p2==*p)
p++;
p2++;
>
if(!*p2) return t;
>
return -1;
>

Надо обратить внимание, как два оператора return упрощают функцию.

Как выйти из метода java

Для выхода из метода в Java можно использовать оператор return .

Если метод должен вернуть результат работы, то этот результат необходимо указать после слова return .

Вызов return из метода main головной программы приведет к окончанию работы программы.

public class App  public static void main(String[] args)  func1(-1); // => n System.out.println(func2(1)); // => n > 0 > public static void func1(int n)  if(n  0)  System.out.println("n ); return; > System.out.println("n > 0"); > public static String func2(int n)  if(n  0)  return "n ; > return "n > 0"; > > 

Как выйти из метода c

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

Но методы также могут возвращать некоторое значение. Для этого применяется оператор return , после которого идет возвращаемое значение:

return возвращаемое значение;

Например, определим метод, который возвращает значение типа string :

string GetMessage()

Метод GetMessage имеет тип string , следовательно, он должен возвратить строку. Поэтому в теле метода используется оператор return , после которого указана возвращаемая строка.

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

string GetMessage()

Также между возвращаемым типом метода и возвращаемым значением после оператора return должно быть соответствие. Например, в следующем случае возвращаемый тип — string , но метод возвращает число (тип int), поэтому такое определение метода некорректно:

string GetMessage() < return 3; // Ошибка! Метод должен возвращать строку, а не число >

Результат методов, который возвращают значение, мы можем присвоить переменным или использовать иным образом в программе:

string GetMessage() < return "Hello"; >string message = GetMessage(); // получаем результат метода в переменную message Console.WriteLine(message); // Hello

Метод GetMessage() возвращает значение типа string . Поэтому мы можем присвоить это значение какой-нибудь переменной типа string: string message = GetMessage();

Либо даже передать в качестве значения параметру другого метода:

string GetMessage() < return "Hello"; >void PrintMessage(string message) < Console.WriteLine(message); >PrintMessage(GetMessage());

В вызове PrintMessage(GetMessage()) сначада вызывается метод GetMessage() и его результат передается параметру message метода PrintMessage

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

int Sum(int x, int y) < return x + y; >int result = Sum(10, 15); // 25 Console.WriteLine(result); // 25 Console.WriteLine(Sum(5, 6)); // 11

Метод Sum() имеет тип int , следовательно, он должен возвратить значение типа int — целое число. Поэтому в теле метода используется оператор return , после которого указано возвращаемое число (в данном случае результат суммы переменных x и y).

Сокращенная версия методов с результатом

Также мы можем сокращать методы, которые возвращают значение:

string GetMessage()

аналогичен следующему методу:

string GetMessage() => "hello";

int Sum(int x, int y)

аналогичен следующему методу:

int Sum(int x, int y) => x + y;

Выход из метода

Оператор return не только возвращает значение, но и производит выход из метода. Поэтому он должен определяться после остальных инструкций. Например:

string GetHello()

С точки зрения синтаксиса данный метод корректен, однако его инструкция Console.WriteLine(«After return») не имеет смысла — она никогда не выполнится, так как до ее выполнения оператор return возвратит значение и произведет выход из метода.

Однако мы можем использовать оператор return и в методах с типом void . В этом случае после оператора return не ставится никакого возвращаемого значения (ведь метод ничего не возвращает). Типичная ситуация — в зависимости от опеределенных условий произвести выход из метода:

void PrintPerson(string name, int age) < if(age >120 || age < 1) < Console.WriteLine("Недопустимый возраст"); return; >Console.WriteLine($"Имя: Возраст: "); > PrintPerson("Tom", 37); // Имя: Tom Возраст: 37 PrintPerson("Dunkan", 1234); // Недопустимый возраст

Здесь метод PrintPerson() в качестве параметров принимает имя и возраст пользователя. Однако в методе вначале мы проверяем, соответствует ли возраст некоторому диапазону (меньше 120 и больше 0). Если возраст находится вне этого диапазона, то выводим сообщение о недопустимом возрасте и с помощью оператора return выходим из метода. После этого метод заканчивает свою работу.

Однако если возраст корректен, то выводим информацию о пользователе на консоль. Консольный вывод:

Имя: Tom Возраст: 37 Недопустимый возраст

Выход из метода типа Void

Как в методе типа void, принудительно выйти из метода? У меня метод для поиска элементов в бинарном дереве, только вот return не работает. Какие еще варианты есть? Заранее спасибо.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
public void SearchElement(int element) { if (left != null && left.key != element) { left.SearchElement(element); } else if (left != null && left.key == element) { Console.WriteLine("Элемент найден"); return; } if (right != null && right.key != element) { right.SearchElement(element); Console.WriteLine("Элемент не найден"); return; } else if (right!=null && right.key == element) { Console.WriteLine("Элемент найден"); return; } }

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Изменение метода с double на void
Ребят, вот не знаю, что делать. Помогите создать второй метод для static double Lol(double.

Unit-тест для void метода
Возник вопрос, как написать юнит тест для void метода, не принимающего ничего. using System;.

178 / 178 / 50
Регистрация: 06.01.2013
Сообщений: 392
Добавлено через 7 минут

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

только вот return не работает

Лично я в вашем коде смысл return’ов вообще не пойму, для чего они там надо?) Скорее всего вы не до конца разобрались для чего он надо. Понимаете, это такая штука которую не надо пихать где попало, она нужна там, где необходимо прервать выполнение метода и возвратить управление вызывающему методу, читаем.

Регистрация: 16.04.2013
Сообщений: 13
Используй break

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public void SearchElement(int element) { if (left != null && left.key != element) { left.SearchElement(element); } else if (left != null && left.key == element) { Console.WriteLine("Элемент найден"); break; } if (right != null && right.key != element) { right.SearchElement(element); Console.WriteLine("Элемент не найден"); break; } else if (right!=null && right.key == element) { Console.WriteLine("Элемент найден"); break; } }

708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384

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

Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668

Какие брейки, какой ретурн к месту, ГРЕШНИКИ.

Ретурн один должен быть. Если правильно поставить условие — вид будет шикарен.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public void SearchElement(int element) { if(left != null) { if(left.key != element) { left.SearchElement(element); } else { Console.WriteLine("Элемент найден"); } } //если не хотим что б искало дальше ставим else if if (right != null && right.key != element) //остальное на домашнее задание }

217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459

Noob.net, здравствуйте, наткнулся на тему гуглом..
Объясните плз почему выход из метода при помощи return так не приветствуется?
Например, у меня в программе: Есть форма, на форме кнопка по нажатию кнопки создаётся поток который выполняет метод и в этом методе я проверяю данные введённые пользователем в Тектсбоксы в разные промежутки времени, если данные *неправильные*(например по указанному пути нет файла), то вывожу MessageBox с предупреждением и выхожу из метода return’ом обратно на форму.
Мне кажется код программы так выглядит намного читабельнее удобнее в понимании и так проще обрабатывать исключения, нежели использовать вложенные if’ы.

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

es_, Всего 2х-уровневая вложенность.

1 2 3 4 5 6 7 8 9 10 11
if(left != null) { if(left.key != element) { left.SearchElement(element); } else { Console.WriteLine("Элемент найден"); } }

Намного читабельнее чем

1 2 3 4 5 6 7 8 9
if (left != null && left.key != element) { left.SearchElement(element); } else if (left != null && left.key == element) { Console.WriteLine("Элемент найден"); return; }

Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668

Лучший ответ

Сообщение было отмечено как решение

Решение

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

Объясните плз почему выход из метода при помощи return так не приветствуется?

я не это имел ввиду.
Лепите ретурнов сколько влезит, но читать ваш код я не буду.
И название ему будет — оно-код

2 ретурна еще можно простить, 3 — очень и очень редко.

Читабельность кода иногда намного больше ценится ежели сам код.
ortex дал достаточное объяснение.

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

Запутанный код — даже если он очень оптимизирован — это плохо.
Сейчас для машин не столько критичны лишние 10мб памяти, а вот непонятный код — проблема для людей, которые будут пытаться улучшить его или дописать что-то.

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

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