Завершение программы C++
Функция, объявленная exit в , завершает программу C++. Значение, предоставленное в качестве аргумента exit , возвращается операционной системе в качестве возвращаемого кода программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Константы EXIT_FAILURE можно использовать, а EXIT_SUCCESS также определенные в , чтобы указать успешность или сбой программы.
Функция abort
Функция abort , объявленная в стандартном формате, включает , завершает программу C++. Разница между exit и abort заключается в том, что exit обработка завершения среды выполнения C++ выполняется (вызывается глобальные деструкторы объектов). abort немедленно завершает программу. Функция abort проходит обычный процесс уничтожения для инициализированных глобальных статических объектов. Также осуществляется обход всей специальной обработки, которая была задана с помощью функции atexit .
Корпорация Майкрософт: по соображениям совместимости Windows реализация abort microsoft может разрешить выполнение кода завершения библиотеки DLL в определенных обстоятельствах. Дополнительные сведения см. в разделе abort .
Функция atexit
Используйте функцию atexit , чтобы указать действия, выполняемые до завершения программы. Перед выполнением функции выхода не инициализированы глобальные статические объекты, инициализированные перед вызовом atexit .
return оператор in main
Инструкция return позволяет указать возвращаемое значение из main . Оператор return в main первую очередь действует как любая другая return инструкция. Все автоматические переменные уничтожаются. main Затем вызывает возвращаемое exit значение в качестве параметра. Рассмотрим следующий пример:
// return_statement.cpp #include struct S < int value; >; int main() < S s< 3 >; exit( 3 ); // or return 3; >
return Операторы exit , описанные в предыдущем примере, имеют аналогичное поведение. Как завершить программу, так и вернуть значение 3 операционной системе. Разница заключается в том, что exit не уничтожает автоматическую переменную s , а return оператор делает.
Как правило, C++ требует, чтобы функции, имеющие возвращаемые типы, отличные от void возвращаемого значения. Функция является исключением. Она main может завершиться без инструкции return . В этом случае он возвращает значение, зависящее от реализации, в вызывающий процесс. (По умолчанию MSVC возвращает значение 0.)
Уничтожение потоков и статических объектов
При вызове exit напрямую (или при вызове после оператора из main ), объекты потоков, связанные с текущим потоком return , уничтожаются. Затем статические объекты уничтожаются в обратном порядке их инициализации (после вызовов функций, указанных в , если таковые имеются atexit ). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1 создаются и sd2 инициализированы перед записью main . После завершения работы этой программы с помощью инструкции return сначала sd2 уничтожается, а затем sd1 . Деструктор класса ShowData закрывает файлы, связанные с этими статическими объектами.
// using_exit_or_return1.cpp #include class ShowData < public: // Constructor opens a file. ShowData( const char *szDev ) < errno_t err; err = fopen_s(&OutputDev, szDev, "w" ); >// Destructor closes the file. ~ShowData() < fclose( OutputDev ); >// Disp function shows a string on the output device. void Disp( char *szData ) < fputs( szData, OutputDev ); >private: FILE *OutputDev; >; // Define a static object of type ShowData. The output device // selected is "CON" -- the standard output device. ShowData sd1 = "CON"; // Define another static object of type ShowData. The output // is directed to a file called "HELLO.DAT" ShowData sd2 = "hello.dat"; int main()
Другой способ написания этого кода заключается в объявлении ShowData объектов с блоком область, который неявно уничтожает их при выходе из область:
Выход из функции
Имеется два способа окончания работы функции и передачи управления вызывающему коду. Первый способ предполагает достижение последнего оператора функции, после чего работа функции заканчивается при встрече >. (Конечно, фигурной скобки на самом деле нет в объектном коде, но никто не мешает нам так думать.) Например, следующая функция выводит на экран строку:
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 упрощают функцию.
Как выйти из функции void c
Возможно ли, Выйти из функции, если она возвращает «void». Что-то вроде «return», только без возвращения значения, просто перейти к коду после вызова функции.
Спасибо.
Re: Выйти из функции, если она возвращает «void»?
От: | VuDZ | |
Дата: | 26.02.02 23:58 | |
Оценка: | 3 (1) |
Здравствуйте Алексей, Вы писали:
А>Возможно ли, Выйти из функции, если она возвращает «void». Что-то вроде «return», только без возвращения значения, просто перейти к коду после вызова функции.
А>Спасибо.
void Foo( void )< // do something if (bError) return; // do something another >
Re: Выйти из функции, если она возвращает «void»?
От: | SDA | |
Дата: | 26.02.02 23:58 | |
Оценка: | 3 (1) |
Здравствуйте Алексей, Вы писали:
А>Возможно ли, Выйти из функции, если она возвращает «void». Что-то вроде «return», только без возвращения значения, просто перейти к коду после вызова функции.
А>Спасибо.
void MyFunc() < if(false) return; >
return;
Как выйти из функции при выполнении условия?
и нужно чтобы в функции events если выполниться условие то она бы вышла или бы скипнула итерацию как например contunie. Что можно использовать?
Отслеживать
задан 22 ноя 2021 в 12:01
53 2 2 серебряных знака 9 9 бронзовых знаков
Где вам нужно скипнуть итерацию? Конкретизируйте вопрос, допустим выполнился метод events , от этого метод Update завершится или перейдет к следующей итерации?
22 ноя 2021 в 12:16
Если вам нужно скип итерации делать внутри events , то в условии добавьте просто return;
22 ноя 2021 в 12:18
например если в events выполниться 1 условие то он просто выйдет не продолжая выполнять остальной код
22 ноя 2021 в 12:18
Остальной код — это какой? Внутри events или внутри Update ?
22 ноя 2021 в 12:19
Такие вопросы неприлично задавать. Что бы самому на него ответить — нужны вообще минимальные знания языка программирования. Простите, но Вам рановато работать в Unity. Для начала Вам следует укрепить свои знания C#. Иначе в дальнейшем Вы будете чаще и чаще сталкиваться с «нерешаемыми самостоятельно проблемами».
22 ноя 2021 в 14:52
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Чтобы выйти из метода можно использовать return; Заметьте, что если метод будет возвращать какое-то значение, то использование обычного return; не будет работать, компилятор потребует какое-то значение.
private void events() < if(/*условие*/) < //код return; //код дальше не будет выполняться, произойдет выход из метода. >>
Отслеживать
ответ дан 22 ноя 2021 в 12:21
Aarnihauta Aarnihauta
2,326 3 3 золотых знака 12 12 серебряных знаков 23 23 бронзовых знака
не думал что можно использовать return без значения. спасибо
22 ноя 2021 в 12:22
@ULYANARSL только если метод void
22 ноя 2021 в 12:23
Один из принципов структурного программирования гласит, что все подпрограммы(в нашем случае методы) должны иметь один вход и один выход. Лучше переписать метод без явного return.
22 июн 2022 в 1:52
@VitaliyZlobin не всегда стоит придерживаться принципов и прочей лабуды которую напридумывали.. не вижу ничего плохого в том, что выход из метода будет по какому-то условию
22 июн 2022 в 4:15
@Aarnihauta это не на придумывали лабуды, а опыт топов и основателей программирования, таких как Эдсгер Дейкстра)) «не всегда стоит придерживаться принципов» — не всегда, но всегда нужно это делать осознанно и обоснованно, в данном случае обоснования нет, т.к. есть возможность обеспечить один выход из метода — это, как минимум, облегчит этапы отладки и тестирования.