[lekcja 20] Funkcje, a słowo kluczowe return Kurs C++ » Poziom 2

background image

Strona 1

[lekcja] Funkcje, a słowo kluczowe return | Kurs C++ » Poziom 2

2011-11-12 17:12:58

http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-a-slowo-kluczowe-return/339

Darmowe kursy Online

»

Kurs C++

»

Poziom 2

Autor: Piotr Szawdyński

Funkcje, a słowo kluczowe return

[lekcja]

Rozdział 20. Jak działa słowo kluczowe returnw funkcjach i jakie są praktyczne zalety z właściwego używania wspomnianegosłowa kluczowego.

Funkcje są potężne. Funkcje są przyjemne. Funkcje są pożyteczne. Funkcje są wygodne. Tak właśnie jest i dlatego powinniśmy starać

się poznać je jak najlepiej. Tym razem przyjżymy się bliżej słowu kluczowemu return, które ma swoje bardzo fajne oblicze o którym nic

nie wiedziałem przez bardzo długi czas zajmowania się programowaniem w C++. Co to jest takiego? Zaraz się o tym dowiesz :)

Co wiemy do tej pory o słowie kluczowymreturn?

Na chwilę obecną o słowie kluczowym return powinieneś wiedzieć tyle, że może występować wewnątrz ciała funkcji i potrafi ono

zwrócić wartość, którą da się odczytać w miejscu gdzie funkcja została wywołana. Z tym się nic nie zmienia i zmieniać nie będzie.

Słowo kluczowe return - nowe oblicze

Skoro przypomnieliśmy sobie co wiemy o słowie kluczowym return, zobaczmy teraz co ono jeszcze potrafi:

słowo kluczowe return może występować wewnątrz funkcji więcej niż raz;
słowo kluczowe return może występować w funkcjach, które nie zwracają wartości.

Jedna funkcja, wiele wystąpieńreturn

Pierwszą nową sprawą, którą omówimy jest funkcja, w której występuje więcej niż raz słowo kluczowe return. Pisząc funkcje, które

zwracają wartość często się zdarza, że na pewnym etapie pisanego kodu wiemy z góry jaki ma zwrócić wynik operacji, a w związku z

tym chcielibyśmy ją przerwać, zwracając jednocześnie interesujący nas wynik. Słowo kluczowe return wychodzi natychmiastowo z

funkcji zwracając jednocześnie wartość jaka zostanie za nim podana. Kod, który się znajdował w dalszej części funkcji nie zostanie już

wykonany, bo i nie ma po co skoro funkcja obliczyła wynik, który chcieliśmy otrzymać. Przejdźmy teraz do przykładu, który zilustruje w

praktyce to co zostało wyżej opisane:

C/C++

bool

czyGodzinaPoprawna

(

int

godz

,

int

min

,

int

sek

)

{

std

::

cout

<<

"Jestem w funkcji czyGodzinaPoprawna

"

<<

std

::

endl

;

if

(

godz

<

0

||

godz

>

23

)

return false

;

std

::

cout

<<

"Godzina jest poprawna"

<<

std

::

endl

;

if

(

min

<

0

||

min

>

59

)

return false

;

std

::

cout

<<

"Godziny i minuty sa poprawne"

<<

std

::

endl

;

if

(

sek

<

0

||

sek

>

59

)

return false

;

std

::

cout

<<

"Czas jest poprawny"

<<

std

::

endl

;

return true

;

}

Funkcja wypisuje komunikaty po to byś miał lepiej zobrazowany temat, który teraz poznajesz - w praktyce są one zbędne i nie
powinno ich tam być.

Jak widać mamy funkcję, która sprawdza czy czas podany poprzez argumenty funkcji jest poprawny. Jeżeli czas jest poprawny to funkcja

powinna zwrócić nam prawdę, czyli true. W przeciwnym wypadku ma zwrócić fałsz tj. false.

Przykładowe wywołania i ich wyniki

Zobaczmy teraz co otrzymamy na ekranie w wyniku wywołania funkcji z różnymi argumentami:

Wywołanie

czyGodzinaPoprawna

(

24

,

30

,

50

)

;

:

Standardowe wyjście:

Jestem w funkcji czyGodzinaPoprawna

Wywołanie

czyGodzinaPoprawna

(

12

,

88

,

50

)

;

:

Standardowe wyjście:

Jestem w funkcji czyGodzinaPoprawna

Godzina jest poprawna

background image

Strona 2

[lekcja] Funkcje, a słowo kluczowe return | Kurs C++ » Poziom 2

2011-11-12 17:12:58

http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-a-slowo-kluczowe-return/339

Wywołanie

czyGodzinaPoprawna

(

1

,

00

,

99

)

;

:

Standardowe wyjście:

Jestem w funkcji czyGodzinaPoprawna

Godzina jest poprawna

Godziny i minuty sa poprawne

Wywołanie

czyGodzinaPoprawna

(

7

,

33

,

01

)

;

:

Standardowe wyjście:

Jestem w funkcji czyGodzinaPoprawna

Godzina jest poprawna

Godziny i minuty sa poprawne

Czas jest poprawny

Praktyczny przykład

Zobaczmy teraz jak można w praktyce wykorzystać funkcję, która została zaprezentowana powyżej - funkcja została okrojona z

komunikatów, które wypisywała:

C/C++

#include <iostream>

bool

czyGodzinaPoprawna

(

int

godz

,

int

min

,

int

sek

)

{

if

(

godz

<

0

||

godz

>

23

)

return false

;

if

(

min

<

0

||

min

>

59

)

return false

;

if

(

sek

<

0

||

sek

>

59

)

return false

;

return true

;

}

void

komunikatCzasu

(

bool

bWynik

)

{

if

(

bWynik

)

std

::

cout

<<

"Czas jest poprawny"

<<

std

::

endl

;

else

std

::

cout

<<

"Czas jest niepoprawny"

<<

std

::

endl

;

}

int

main

()

{

komunikatCzasu

(

czyGodzinaPoprawna

(

24

,

30

,

50

) )

;

komunikatCzasu

(

czyGodzinaPoprawna

(

12

,

88

,

50

) )

;

komunikatCzasu

(

czyGodzinaPoprawna

(

1

,

00

,

99

) )

;

komunikatCzasu

(

czyGodzinaPoprawna

(

7

,

33

,

01

) )

;

return

0

;

}

Standardowe wyjście programu:

Czas jest niepoprawny

Czas jest niepoprawny

Czas jest niepoprawny

Czas jest poprawny

Słowo kluczowe return w funkcjachniezwracającychwartości

Skoro już wiemy co potrafi słowo kluczowe return to zajmijmy się już formalnościami związanymi z funkcjami, które nie zwracają

wartości. Słowo kluczowe return może występować w takich funkcjach. Pełni ono taką samą rolę jak w funkcjach, które zwracają

wartość z tą różnicą, że wartości żadnej nie zwraca. Skoro funkcja nie zwraca żadnej wartości to i za słowem kluczowym return

również nie umieszczamy żadnej wartości. W praktyce więc może to wyglądać tak:

C/C++

#include <iostream>

void

wyswietl

(

int

tablica

[]

,

int

ile

)

{

if

(

ile

<=

0

)

{

std

::

cout

<<

"Tablica jest pusta."

<<

std

::

endl

;

return

;

}

//if

int

i

=

0

;

do

background image

Strona 3

[lekcja] Funkcje, a słowo kluczowe return | Kurs C++ » Poziom 2

2011-11-12 17:12:58

http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-a-slowo-kluczowe-return/339

{

std

::

cout

<<

tablica

[

i

] <<

", "

;

i

++

;

}

while

(

i

<

ile

)

;

std

::

cout

<<

std

::

endl

;

}

int

dopisz

(

int

iLiczba

,

int

tablica

[]

,

int

ile

)

{

tablica

[

ile

] =

iLiczba

;

ile

++

;

return

ile

;

//zwraca ile jest elementów po dodaniu nowego

}

int

main

()

{

int

liczbaElementow

=

0

;

int

tablicaLiczb

[

10

]

;

wyswietl

(

tablicaLiczb

,

liczbaElementow

)

;

liczbaElementow

=

dopisz

(

123

,

tablicaLiczb

,

liczbaElementow

)

;

wyswietl

(

tablicaLiczb

,

liczbaElementow

)

;

liczbaElementow

=

dopisz

(

321

,

tablicaLiczb

,

liczbaElementow

)

;

wyswietl

(

tablicaLiczb

,

liczbaElementow

)

;

return

0

;

}

Wyjaśnień więcej myślę, że tu nie potrzeba, więc sprawę uważam za zamkniętą :) Przeanalizuj jednak dobrze powyższy przykład -

zawiera on bardzo ciekawą obsługę dodawania elementów do tablicy, która z pewnością jest dla Ciebie dobrym elementem edukacyjnym.

Praktyczne zastosowania

O ile zastosowanie słowa kluczowego return jest wygodne w sytuacjach, które zostały opisane o tyle jest ono niezastąpione w

momencie gdy mamy funkcję, w której mamy zagnieżdżone pętle i wewnątrz nich w pewnym momencie stwierdzimy: 'Okej, wynik już

znam - wychodzimy z tej funkcji'. Robienie warunków po to by wyjść z tych zagnieżdżonych pętli to byłaby droga przez mękę, więc

praktycznie zawsze w takich sytuacjach wykorzystuje się omówioną własność słowa kluczowego return.

Zwracaniewartości przez funkcję

Pamiętaj, że funkcja, która zwraca wartość musi zwracać ją zawsze. Jeżeli funkcja dojdzie do końca bloku funkcji i nie napotka słowa

kluczowego return zachowanie wyjścia z funkcji jest niezdefiniowane. Oznacza to, że aplikacja może zakończyć pracę poprzez

wystąpienie błędu krytycznego aplikacji. Niektóre kompilatory łagodniej się w tych sytuacjach obchodzą i zwracają one wówczas

przypadkową wartość.

Przykład niebezpiecznejfunkcji

Załóżmy teraz, że napiszemy funkcję w której nie wszystkie możliwe ścieżki przejścia będą zwracały wartość:

C/C++

int

funkcja

(

int

liczba

)

{

if

(

liczba

>

10

)

return

0

;

}

Próba kompilacji się powiedzie , jednak powinno pojawić się ostrzeżenie o następującej treści :

Code::Blocks - MinGW 4.4.1

In function 'int funkcja(int)':

warning: control reaches end of non-void function

Visual C++ 2008

warning C4715: 'funkcja' : not all control paths return a value

Ostrzeżenie to informuje, że funkcja nie uwzględnia wszystkich możliwych ścieżek przejścia, co w konsekwencji może dla pewnych

danych spowodować niezdefiniowane zachowanie kodu. Log kompilacji jest Twoim przyjacielem i nie należy przechodzić obok niego

nigdy obojętnie. Czytaj więc go i staraj się pisać kod tak aby żadne ostrzeżenia nie pojawiały się w logu kompilacji.

A co gdy nie dostałeś ostrzeżeniadla przykładowegokodu?

Taka sytuacja również może się zdarzyć. Wówczas należy wejść w opcje kompilatora i włączyć odpowiednią opcję .

Code::Blocks

W menu wybrać pozycję Settings;

background image

Strona 4

[lekcja] Funkcje, a słowo kluczowe return | Kurs C++ » Poziom 2

2011-11-12 17:12:58

http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-a-slowo-kluczowe-return/339

Architektserwisu: Piotr Szawdyński

© Wszelkieprawa zastrzeżone2005-2011

następnie Compiler and debugger;
Zaznaczyć opcję : Enable all compiler warnings (overrides every other setting) [-Wall]
Zatwierdzić przyciskiem OK

Visual C++

W przypadku Visual C++ zalecam zwiększyć poziom ostrzeżeń z 3 stopnia na 4 stopień. Użytkownicy Visual C++ powinni sobie z tym

poradzić - niniejszy kurs jest poświęcony Code::Blocks, więc szczegóły zostaną w tym przypadku pominięte.

Wszystkieteksty są chronioneprawami autorskimi. Kopiowanielub rozpowszechnianietreści poza niniejszymserwisem jest

zabronione.

Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechnianiawłasnego tekstu wedle własnego uznania.


Wyszukiwarka

Podobne podstrony:
[lekcja 13] Instrukcja warunkowa if else Kurs C++ » Poziom 1
[lekcja 8] Pojęcie zmiennej i podstawowe typy danych Kurs C++ » Poziom 1
[lekcja 13] Instrukcja warunkowa if else Kurs C++ » Poziom 1
[lekcja 17] Funkcje pierwsze starcie Kurs C++ » Poziom 2
[lekcja 19] Przekazywanie tablic jednowymiarowych do funkcji Kurs C++ » Poziom 2
[lekcja 11] Operacje porównania Kurs C++ » Poziom 1
[lekcja 12] Operacje logiczne Kurs C++ » Poziom 1
[lekcja 15] Pętla do while Kurs C++ » Poziom 2
[lekcja 16] Pseudolosowe liczby całkowite Kurs C++ » Poziom 2
[lekcja 7] Przestrzeń nazw std Kurs C++ » Poziom 1
[lekcja 2] Podstawy programowania teoria i terminologia Kurs C++ » Poziom 1
[lekcja 21] Losowanie bez powtórzeń Kurs C++ » Poziom 2
[lekcja 4] Podstawy programowania w C++ Kurs C++ » Poziom 1
[lekcja 5] Komentarze Kurs C++ » Poziom 1
[lekcja 1] Wybieramy środowisko pracy Kurs C++ » Poziom 1
[lekcja 10] Operacje matematyczne Kurs C++ » Poziom 1
[lekcja 9] Obsługa strumienia wejściowego Kurs C++ » Poziom 1

więcej podobnych podstron