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

question-closed Zwracanie int na końcu pentli głównej

VPS Starter Arubacloud
+1 głos
205 wizyt
pytanie zadane 25 marca 2018 w C i C++ przez niezalogowany
zamknięte 30 marca 2018
Witam.

Po co daje się na końcu programu return 0;. W jakich sytuacjach robi to różnice jeżeli kompiluje się i bez tego?
komentarz zamknięcia: Temat wyczerpany
komentarz 26 marca 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Temat wyczerpany? Można zamknąć?

2 odpowiedzi

+2 głosów
odpowiedź 26 marca 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 26 marca 2018
 
Najlepsza

Jak słusznie mój poprzednik wspomniał, main to nie jest żadna pętla, lecz funkcja. Jest to taka wyjątkowa funkcja, ponieważ prawie każdy kod źródłowy pisany w języku C++ (wykluczając między innymi biblioteki) musi tę funkcję posiadać.

Jak słusznie zauważyłeś, funkcja ta zwraca typ int. Ale po co? 

Funkcja main, upraszczając, jest wywoływana (niekoniecznie bezpośrednio) przez system operacyjny. Jako parametry podaje on między innymi argumenty, z jakimi został wywołany nasz program. Taki standardowy nagłówek funkcji main() wygląda tak:

int main(int argc, char* argv[])

Chociaż jako ciekawostkę powiem, że istnieje również wersja z trzema parametrami. wink

Natomiast system operacyjny (jak i część użytkowników) odczekuje od Twojego programu odpowiedzi - czy wszystko wykonało się poprawnie? Oczywiście, ty możesz to wyraźnie napisać w programie. Ale co wtedy, kiedy użytkownik Twojego programu będzie chciał wykorzystać go w jakimś skrypcie?

Załóżmy, że jesteś autorem programu konsolowego dodającego użytkowników w systemie. W jaki sposób skrypt miałby sprawdzić, czy wszystko poszło jak należy? Chyba przydałaby się wygodniejsza metoda sprawdzenia tego, niż analizowanie tekstu, który wypisałby twój program. O ile dla człowieka nie stanowi to problemu, dla skryptu już większy.

Właśnie po to służy wartość zwracana przez funkcję main. Przykładowo, polecenie useradd w systemie Linux zwraca odpowiednie wartości zależnie od tego czy udało się stworzyć użytkownika, czy nie i ewentualnie jaki błąd wyskoczył: czy użytkownik już istniał, czy może niepoprawnie skorzystaliśmy z programu podając mu złe dane, czy może grupa do której chcieliśmy dodać użytkownika nie istnieje.

Zazwyczaj jest tak, że program który zwraca 0 informuje w ten sposób, że wykonał się jak najbardziej poprawnie, a program zwracający inne wartości - już niekoniecznie.

Pozostaje jeszcze jedno pytanie - jak tę wartość odczytać?

W systemie Windows errorlevel (czyli właśnie ta wartość zwrócona przez funkcję main) ostatniego wykonanego polecenia znajduje się w zmiennej środowiskowej... %errorlevel%. Aby ją sobie wypisać, możesz zastosować polecenie CMD:

echo %errorlevel%

Natomiast na systemach Unix i Uniksopodobnych (np. Linux, BSD, macOS), wartość ta siedzi w zmiennej $?. Aby ją wyświetlić, stosujemy składnię (bash):

echo $?

No i to tyle.

Jako ciekawostkę powiem, że w C++ nie ma obowiązku pisania returna na końcu funkcji main - zwróci się automatycznie zero. W każdym razie należy pamiętać, że jest to jedyna w swoim rodzaju taka funkcja. W innych funkcjach zwracających jakiś typ wartości musimy sami zadbać o to, aby jakaś wartość została zwrócona.

komentarz 26 marca 2018 przez Hiskiel Pasjonat (22,830 p.)
Miałbym do Pana pytanie. Jak wygląda main z 3 trzema argumentami i po co ten trzeci?

I czym się różni taki np. _tmain od zwyczajnego maina? Gdzie tak wgl jest napisane jakie mainy mogą być stosowane a jakie nie? Ponieważ np. WinApi ma własnego WinMaina.
komentarz 26 marca 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Wersja z trzema parametrami jest typowo unixowa i wygląda tak:

int main(int argc, char* argv[], char* envp[])

A o Windowsie zbytnio nie wiem, więc się nie wypowiem.smiley

1
komentarz 26 marca 2018 przez mokrowski Mędrzec (155,460 p.)

W 3 argumencie masz zmienne środowiska uruchomienia programu. Napisy w stylu:

ZMIENNA=wartość_zmiennej

W systemach GNU/Linux lub innych "*nixowych" na konsoli wykonaj polecenie:

set

... i je zobaczysz.

W systemach MS wykonaj w konsoli cmd (uwaga zaskoczenie):

SET

Dodatkowo main() nie wolno wywoływać bezpośrednio, z użyciem rekurencji ani oczekiwać że może mieć jakikolwiek adres. Jej dokładna implementacja zależy od systemu operacyjnego.

Z ciekawostek, kod błędu > 128 w systemach POSIX (wszelkie *nix), świadczy o zakończeniu programu przez sygnał. Wystarczy odjąć te 128 i masz numer sygnału.

Bywa stosowany także jeszcze jeden zwyczaj. Jeśli chcesz zwrócić do systemu informację że coś poszło źle, w nagłówku <cstdlib> masz makro EXIT_FAILURE . Oczywiście istnieje także informacja że wszystko poszło dobrze ( EXIT_SUCCESS ).

+1 głos
odpowiedź 25 marca 2018 przez Hiskiel Pasjonat (22,830 p.)
Nie jest to pętla główna. main jest to funkcja od której zaczyna się program. Jest to też ostatnia funkcja na której się kończy (gdy dojdziesz do końca podstaw i będziesz wiedział co to stos to zrozumiesz). Przyjęło się, że jeśli program zwraca do systemu 0 (to jest właśnie to return 0 na końcu main) to wszystko zostało poprawnie wykonane.

Z tego co mi się o uszy obiło, to podobno nie trzeba tego stosować.

https://4programmers.net/Forum/C_i_C++/278981-brak_return_0_w_funkcji_main

Podobne pytania

0 głosów
1 odpowiedź 433 wizyt
pytanie zadane 22 sierpnia 2016 w JavaScript przez Śmieszek_;3 Użytkownik (780 p.)
0 głosów
3 odpowiedzi 446 wizyt
pytanie zadane 3 września 2016 w C i C++ przez karmider013 Początkujący (340 p.)
0 głosów
1 odpowiedź 772 wizyt
pytanie zadane 26 marca 2016 w C i C++ przez TheFeniks Gaduła (4,710 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...