• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Różnica między return 0; a exit(0); ?

Aruba Cloud - Virtual Private Server VPS
0 głosów
4,650 wizyt
pytanie zadane 6 lutego 2019 w C i C++ przez Thanat0s666 Nowicjusz (230 p.)
zamknięte 6 lutego 2019 przez Thanat0s666
Witam dopiero zaczynam przygodę z programowaniem więc proszę o wyrozumiałość :)

Chciałbym zrozumieć jaka jest istota różnicy między tymi poleceniami gdyż pisząc kilka programów w "menu" programu nie raz dodaję opcję wyjścia z niego którą realizuję zwyczajnie zwracając 0 czy dowolną liczbę całkowitą w każdym razie komendą return, podczas gdy większość robi to komendą exit. Mogę prosić o wyjaśnienie równicy miedzy tymi opcjami? Plus czy są inne sposoby inne polecenia na zakończenie programu? Może mają jeszcze inne funkcjonalności?

Pozdrawiam
komentarz zamknięcia: rozwiązany

2 odpowiedzi

+1 głos
odpowiedź 6 lutego 2019 przez adrian17 Mentor (352,580 p.)
wybrane 6 lutego 2019 przez Thanat0s666
 
Najlepsza
`return` wychodzi z obecnej funkcji (i zwraca daną wartość, jeśli funkcja ma coś zwracać). Jeśli program dojdzie do końca funkcji bez returna, funkcja też się zakończy bez zwracania niczego.

Jeśli wychodzisz z funkcji `main`, to jest to równoważne zakończeniu programu.

exit(0) od razu terminuje program. W C++ie zazwyczaj nie powinno się go w ogóle używać, bo wyjście exit()em omija wywołanie destruktorów, przez co program może zostawić po sobie dziwny, nieposprzątany stan.
komentarz 6 lutego 2019 przez mokrowski Mędrzec (158,200 p.)

exit(0) od razu terminuje program. W C++ie zazwyczaj nie powinno się go w ogóle używać, bo wyjście exit()em omija wywołanie destruktorów, przez co program może zostawić po sobie dziwny, nieposprzątany stan.

Że co??? https://en.cppreference.com/w/cpp/utility/program/exit

komentarz 6 lutego 2019 przez adrian17 Mentor (352,580 p.)

Może konkretniej: omija wywołanie destruktorów obiektów o automatycznym czasie życia.

Z tego linku:

Stack is not unwound: destructors of variables with automatic storage duration are not called.

komentarz 6 lutego 2019 przez mokrowski Mędrzec (158,200 p.)

Pozostanę przy informacjach z cppref. W standardzie na życzenie także znajdę.

exit(0) od razu terminuje program.

W szczegółach .. std::at_exit(..).  https://en.cppreference.com/w/cpp/utility/program/atexit oraz std::at_quick_exit(...)

W C++ie zazwyczaj nie powinno się go w ogóle używać,

Po to właśnie jest exit() by tak działał. Ma pozostawić stan programu "z zerwaniem" oraz z stanem na na moment wykonania exit(...) a także zwrócić kod błędu. To taka sama ważkość stwierdzenia że nie powinno się używać asercji. One przecież także nie uruchamiają destruktorów obiektów automatycznych. 

bo wyjście exit()em omija wywołanie destruktorów, przez co program może zostawić po sobie dziwny, nieposprzątany stan.

Nieprawda. Stan jest stabilny i ustalony bo exit() adresuje w pełni potrzeby systemu operacyjnego a nie stanu aplikacji! Od stanu aplikacji są inne konstrukty. Proces zostanie poprawnie zakończony, jedynie miejsca persystencji programu będą zachowane (lub nie) na moment wykonania std::exit(...).

Dodatkowo: 

https://en.cppreference.com/w/cpp/error/terminate

https://en.cppreference.com/w/cpp/error/terminate_handler

https://en.cppreference.com/w/cpp/utility/program/abort

Warto sobie zbudować nieco pełniejszy obraz zakończenia programu w C++. IMHO "nie używaj std::exit(...)", to zbyt daleko idące uogólnienie.

 

komentarz 6 lutego 2019 przez adrian17 Mentor (352,580 p.)
edycja 6 lutego 2019 przez adrian17

Powtórzę to co zazwyczaj: czepiasz się. Mi nie musisz niczego szukać w standardzie - celowo upraszczam wyjaśnienia osobom, które dopiero zaczynają z językiem. Gdybym chciał im opisać jak dokładnie działa exit(), wysłałbym im po prostu link do cppreference.

- celowo nie wspomniałem o std::atexit, bo uważałem że nie ma potrzeby na tym poziomie szczegółowości.

- osobiście uważam nie używanie exit za best practice - oczywiście od każdego takiego są wyjątki. Ale typowy case osoby początkującej jest taki, że robi klasyczny program konsolowy ze switchem na komendy plus jakieś fstreamy, wywołuje exit i dziwi się czemu coś, co przecież "wpisała" do pliku, jednak się nie zapisało. Ten sam footgun zdarzało mi się widywać też w normalnych zawodowych projektach, stąd taka moja opinia. (Może jednak powinienem był dodać "moim zdaniem".)

Nieprawda. Stan jest stabilny i ustalony bo exit() adresuje w pełni potrzeby systemu operacyjnego a nie stanu aplikacji!

Na litość... nie chodzi mi tu o semantykę i terminologię. Chodzi mi tu o praktykę -wywołujesz exit i dziwisz się czemu dwa pliki do których pisałeś w funkcji się zapisały, a dwa nie. Gdybym zobaczył gdzieś taki połowicznie zmodyfikowany katalog nie znając przyczyny, tak, nazwałbym to "dziwnym stanem".

Dodatkowo:

Stan jest stabilny i ustalony bo exit() adresuje w pełni potrzeby systemu operacyjnego a nie stanu aplikacji! Od stanu aplikacji są inne konstrukty. 

To w sumie ładnie podsumowuje moją opinię - częstym błędem początkujących jest używanie exit() jako części normalnej logiki aplikacji - po prostu próbuję temu zapobiec.

komentarz 6 lutego 2019 przez mokrowski Mędrzec (158,200 p.)
Ok. "Mityczny początkujący" z naszej dyskusji wyciągnie merytoryczne wnioski.
0 głosów
odpowiedź 6 lutego 2019 przez niezalogowany
return jest instrukcją języka zwraca wartość na końcu wywoływanej funkcji. Exit kończy cały program i jest poleceniem systemowym.

Podobne pytania

0 głosów
2 odpowiedzi 1,751 wizyt
pytanie zadane 11 marca 2017 w C i C++ przez Evelek Nałogowiec (28,960 p.)
0 głosów
3 odpowiedzi 696 wizyt
pytanie zadane 19 listopada 2015 w C i C++ przez RoXoR Początkujący (280 p.)
0 głosów
2 odpowiedzi 275 wizyt
pytanie zadane 20 lutego 2021 w JavaScript przez Szyszka Gaduła (3,510 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,663 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...