Definicje a deklaracje oraz continue

Odpowiedz Nowy wątek
2012-05-20 11:09
0

Uczę się języka C++. Jednak już na początku mam problem z tymi pojęciami. Za bardzo nie rozróżniam od siebie definicji od deklaracji.
Kolejną rzeczą jest w pętlach continue. Też za bardzo z czym to się je. Mógłbym ktoś życzliwy mi wyjaśnić?

Pozostało 580 znaków

2012-05-20 11:31

Deklaracja:

http://www.ithelpdesk.pl/kurs[...]icjalizacja-w-jezyku-c++.html napisał(a)

Deklaracja informuje kompilator, że dana nazwa jest już znana. Pamięć dla obiektu nie zostaje jednak przydzielona. Do obiektu nie możemy się odwoływać, nie możemy mu przypisywać wartości, bowiem on tak naprawdę jeszcze nie istnieje.

Czyli: informujesz kompilator, że np.zamierzasz zadeklarować daną funkcję, ale jeszcze nie teraz.
Weźmy na przykład taką sytuację:

void fun1(int a)
{
 fun2(a)
}

void fun2(int b)
{
 fun1(b)
}

Błąd mamy w 3 linijce, ponieważ kompilator póki co nie wie, gdzie szukać funkcji "fun2".
Aby rozwiązać ten problem możemy zrobić np.to:

void fun2(int); //<- to jest deklaracja; czyli, że nie piszemy ciała funkcji, ale mówimy kompilatorowi, że ta funkcja znajduje się nieco dalej

void fun1(int a)
{
 fun2(a)
}

void fun2(int b)
{
 fun1(b)
}

Z kolei definicja:

http://www.ithelpdesk.pl/kurs[...]icjalizacja-w-jezyku-c++.html napisał(a)

Podczas gdy deklaracja ma jedynie informować czym jest dany identyfikator w programie, to celem definicji jest dokładne określenie, czym jest dany identyfikator.

Definicja rezerwuje miejsce w pamięci dla danej zmiennej. Dla jakiej zmiennej? No właśnie - zmienna musi być przecież gdzieś zadeklarowana, żeby była znana jej nazwa oraz typ. Otóż jest w tym pewna pułapka, bowiem każda definicja jest jednocześnie deklaracją (ale nie odwrotnie).

Czyli powracając do wcześniejszego kodu:

void fun2(int); //<- to jest deklaracja

void fun1(int a) //<- to jest definicja+deklaracja (w sensie - cała funkcja, a nie tylko ta linijka)
{
 fun2(a)
}

void fun2(int b) //<- to jest definicja+deklaracja (j/w)
{
 fun1(b)
}

edytowany 1x, ostatnio: Patryk27, 2012-05-20 11:32

Pozostało 580 znaków

2012-05-20 11:56
0

Bardzo dziękuję za bardzo jasne wyjaśnienie mi definicji i deklaracji. Jednak jak teraz wygląda sprawa z continue?

Pozostało 580 znaków

2012-05-20 12:08
0
Dywan napisał(a):

Bardzo dziękuję za bardzo jasne wyjaśnienie mi definicji i deklaracji. Jednak jak teraz wygląda sprawa z continue?

Tak trudno poszukać w internecie, albo otworzyć książkę?

continue przerywa wykonywanie danego kroku w pętli i przechodzi do następnego.


Idiots, idiots everywhere.

Pozostało 580 znaków

2012-05-20 12:09
0

Wywołanie continue skutkuje przeniesieniem sterowania na początek danej pętli.
Pewnie niewiele Tobie to mówi? ;)

Przykład:

 int i = 0;
 while (i < 10)
 {
  i++;
  if (i&1)
   continue;
  printf("%i jest liczba parzysta\n", i);
 }

Ten kod wyświetli liczby parzyste z zakresu 1-10

Przestudiujmy go:

 int i = 0; //deklaracja zmiennej `i` oraz ustawienie jej wartości na `0`
 while (i < 10) //pętla
 { //początek bloku
  i++; //inkrementacja zmiennej `i`
  if (i&1) //sprawdzenie czy zmienna `i` NIE jest parzysta (liczby parzyste w systemie dwójkowym "kończą się" na `1`)
   continue; //jeżeli nie jest parzysta, to skaczemy z powrotem do pierwszej instrukcji w pętli; czyli tutaj "continue" spowoduje przeniesienie sterowania z powrotem do "i++"; coś jak `goto`
  printf("%i jest liczba parzysta\n", i); //no i jeżeli parzysta, to wyświetlamy informację
 }

Ten kod jest równoważny z tym:

 int i = 0;
 while (i < 10)
 {
  begin:
  i++;
  if (i&1)
   goto begin;
  printf("%i jest liczba parzysta\n", i);
 }

Tylko w przypadku pętli "for" iterator zostanie także podniesiony bądź obniżony o zadaną liczbę.
Np.

 for (int i = 1; i<10; i++)
 {
  if (i&1)
   continue;
  printf("%i jest liczba parzysta\n", i);
 }

edytowany 1x, ostatnio: Patryk27, 2012-05-20 12:11

Pozostało 580 znaków

2012-05-20 12:29
0

To w takim wypadku wymagane jest stosowanie continue?

 for (int i = 1; i<10; i++)
 {
  if (i&1)
   continue;
  printf("%i jest liczba parzysta\n", i);
 }

Nie można byłby tego zapisać tak?

for (int i = 1; i<10; i++)
 {
  if (i mod 2 = 0)
    cout << "Liczba ",i," jest parzysta." << endl;
 }
Także tak można to zapisać, tylko przy kilku warunkach kod zacząłby się mieszać. - Patryk27 2012-05-20 12:30
Tutaj jest trochę innych, nieco bardziej logicznych przykładów: http://www.learncpp.com/cpp-tutorial/58-break-and-continue/ - Patryk27 2012-05-20 12:32

Pozostało 580 znaków

2012-05-20 13:53
0

continue można wyjaśnić w bardzo łopatologiczny sposób:
Dla każdej pętli for czy while czy też do while, continue jest skokiem na "klamerkę zamykającą" czyli pomiędzy ostatnią instrukcją bloku pętli a końcem bloku pętli.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0