Definicje a deklaracje oraz continue

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ć?

0

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)
}
0

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

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.

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);
 }
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;
 }
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.

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