Kłopot ze zrozumieniem przykładu pętli for

0

Chodzi o coś takiego:

for (n-=3; n ;n--)

rozumiem, że to "-=" oznacza zmniejsz i przypisz, ale nie bardzo rozumiem sens tego. W jaki sposób w takim razie zachowuje się wartość n? Bo po prostu jestem przyzwyczajoney do czegoś takiego: for (n=coś;n<innecoś;n++) a w przykładzie wyżej jakoś nie mogę sobie tego wyobrazić.

n-- to dekrementacja n o 1, tak? no dobra, ale jak mam rozumieć w takim razie to środkowe n? czy ono jest większe czy mniejsze od jakiejś wartości?

No właśnie kotłuje mi się to wszystko jakoś;-))

0

http://ideone.com/RiHJm

Innymi słowy, pętla napisana w ten sposób:

#include <iostream>

int main()
{
 for (int i = 10; i; i--)
  std::cout << i << std::endl;
}

Jest równoważna tej:

#include <iostream>

int main()
{
 for (int i = 10; i!=0; i--)
  std::cout << i << std::endl;
}
0

środkowe "n" to warunek, to pewnie wiesz. Warunek ten wygląda tak:
jeżeli n==true wyjdź z pętli. A co to znaczy, że n (prawdopodobnie int) ma się równać true? True==1, false == 0 , po prostu człowiekowi łatwiej zapamiętać wartości bool true/false niż 1/0 :)

n-- to dekrementacja, ale raczej lepiej jest używać preinkrementacji i predekrementacji niż post inkrementacji/dekrementacji.

Z dokumentacji ISO/IEC 14882 2011 C++

A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true
becoming one.

0

Można to przepisać tak:

// n ma jakas tam wartosc
for (int i = n - 3; i != 0; i--)
    //...
0
rincewind napisał(a):

Można to przepisać tak:

// n ma jakas tam wartosc
for (int i = n - 3; i != 0; i--)
    //...

No dobra, to wiem, ale zatem czy ja poprawnie rozumuję?: i--=(n-3)-- ? Bo tu mi się właśnie kiełbasi. Mechanizm for w nawiasach z obliczeniem wartości n-tego wyrazu c. fibonacciego.

0

Doczytałem, że chodzi o takie "przesunięcie" matematyczne w prawo.

int fib(int n)
{
int a=1,b=1, answer=2;
if (n<3) return 1;
for (n-=3;n;n--)
{
a=b;
b=answer;
answer=a + b;
}
return answer;
}

Po prostu dopiero pod koniec doczytałem, że sedno tkwi w ciele pętli for. A swoją drogą martwi mnie to wszystko,bo są rozdziały, które chwytam w lot, a są czasem drobiazgi, nad którymi się pół dnia zastanawiam;-))

0

ten kod:

for (n-=3; n ;n--)

jest równoważny temu:

n = n - 3;
for ( ; n != 0; n--)

Pierwsza część fora wykonuje się tylko raz. I nie ma znaczenia co tam wpiszesz, chociaż najczęściej jest to przypisanie deklaracja zmiennej i jej inicjalizacja, np.

for(int i = 0; i < 10; i++)

Ale możesz tam wpisać dowolną instrukcję, możesz też zostawić to miejsce puste :)

Druga część to warunek pętli. Gdy stanie się fałszywy to pętla przestanie się wykonywać. "n" zwraca true gdy jest wartością różną od zera. A więc pętla zakończy się, gdy n stanie się równe zero. Trzecia część fora wykonuje się zawsze po zakończeniu danej iteracji.

Więc dla n = 4 i takiego fora:

for (n-=3; n ;n--)
cout << ".";

Będzie wypisana jedna kropka.

Dla n = 6 będą wypisane 3 kropki. Dla n = 2 kropki będą wypisywane "w nieskończoność"(hmm... albo do minimalnej wartości tej zmiennej, czyli dla inta ~-4 000 000 000)
, dlatego że warunek nigdy nie dostanie osiągnięty.

Teraz rozumiesz? :P

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