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

Funkcja rekurencyjna bez returna.

Object Storage Arubacloud
0 głosów
397 wizyt
pytanie zadane 18 stycznia 2016 w C i C++ przez Seamel Nowicjusz (120 p.)

Czemu poniższa funkcja działa pomimo braku returna przed wywołaniem NWD(a,b)? Jest jakaś domyślna wartość którą zwraca funkcja jeśli nie użyjemy return czy poprostu kompilator dopisał return za mnie?

int NWD(int a,int b)
{
    if(a!=b)
    {
        if(a>b) NWD(a-b,b);
        else NWD(a,b-a);
    }
    else
        return a;
}

Jakieś pomysły?

4 odpowiedzi

+3 głosów
odpowiedź 18 stycznia 2016 przez andrzej_bl Bywalec (2,390 p.)

Definiując funkcję typu int rezerwujesz w pamięci cztery bajty do których komenda return wpisze odpowiednią wartość. Każda funkcja kończy działanie gdy natrafi na return lub gdy zakończy się jej kod (natrafi na } kończącą funkcję).

Twoja funkcja kończy działanie właśnie w ten drugi sposób, nie wpisując nic do zarezerwowanych komórek pamięci, a więc zwraca zupełnie przypadkowe wartości.

komentarz 18 stycznia 2016 przez Seamel Nowicjusz (120 p.)

Nie są zupełnie przypadkowe jeśli w 100% przypadków funkcja działa poprawnie. Z tego co zdążyłem zauważyć taka funkcja zwraca wynik ostatniego działania w programie np coś takiego 

...
int a()
{
}
int main()
{
    int t=6;
    t++;
    cout<<a();
}

wypisuje zawsze siódemkę, w przypadku gdy zainicjalizujemy t lecz nie będziemy go używać w konsoli zostanie wypisana jakaś przypadkowa wartość, choć zauważyłem, że ta "przypadkowa" wartość powtarza się przy kilkukrotnym uruchomieniu programu raz za razem.

komentarz 18 stycznia 2016 przez andrzej_bl Bywalec (2,390 p.)

Mówiąc "przypadkowe" nie miałem na myśli losowych, a jedynie trudne do przewidzenia.

Nie są zupełnie przypadkowe jeśli w 100% przypadków funkcja działa poprawnie.

Nie działa poprawnie. Gdy próbowałem policzyć Twoją funkcją NWD( 6,  27) otrzymałem wartość -1.

komentarz 18 stycznia 2016 przez Seamel Nowicjusz (120 p.)
edycja 18 stycznia 2016 przez Seamel

Dziwne, mi zgodnie z oczekiwaniami wypisuje 3 (gcc 4.9.2) mógłbyś podać nazwę swojego kompilatora?

EDIT: http://ideone.com/HSaUEn tu również działa (gcc)

EDIT2: http://ideone.com/uKmbOi tu kompilowane clangiem daje 6

komentarz 19 stycznia 2016 przez andrzej_bl Bywalec (2,390 p.)
Na Code::Block 13.12 (gcc 4.7.1) rzeczywiście wyniki są poprawne (ciekawe dlaczego?), wcześniej próbowałem Dev-C++ 4.9.9.2 (gcc 3.4.2) - tu pojawiał się wynik -1.
+2 głosów
odpowiedź 18 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Takie postępowanie jest niepoprawne - każda funkcja o typie różnym od void musi zwracać jakąś wartość - w innym przypadku może to prowadzić do niezdefiniowanych zachowań.

+1 głos
odpowiedź 18 stycznia 2016 przez Avalon Obywatel (1,130 p.)
Może to zależeć od kompilatora,na dole artykułu masz to wyjaśnione:

http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-a-slowo-kluczowe-return/339
0 głosów
odpowiedź 18 stycznia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)
Ta funkcja odpisali return w odpowiednim momęcie, czyli gdy zajdzie else

Podobne pytania

0 głosów
1 odpowiedź 908 wizyt
pytanie zadane 24 czerwca 2016 w C i C++ przez DeBos123 Nałogowiec (44,950 p.)
0 głosów
3 odpowiedzi 168 wizyt
pytanie zadane 5 lipca 2018 w Java przez michaljbjj Początkujący (460 p.)
0 głosów
0 odpowiedzi 299 wizyt
pytanie zadane 15 października 2019 w C i C++ przez four Użytkownik (720 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...