Witam. Może mi ktoś wytłumaczyć dlaczego przy takiej instrukcji: for(int j=n-1;(n-k)<j;j- -)n*=j; dla n=7 i k=3 zwraca wartość n=42, a dla tych instrukcji: x=n-k; for(int j=n-1;x<j;j- -)n*=j; dla tych samych n i k zwraca wartość n=210? Pozdrawiam.
Dzieje się tak ponieważ w C/C++ warunek kontynuacji pętli jest za każdym razem obliczany na nowo podstawiając wartości za zmienne. To znaczy jeśli twoim warunkiem w pętli 1 jest n-k<j a zmienna n ma na początku wartość 7 to warunek przyjmuje postać 7 - 3 < 8. Ale to “7” jest tylko tymczasowe, później postawiasz n := n * j = 7 * 6 = 42. Dlatego przy drugim obiegu n-k<j to już nie 7-3 < 8, ale po zmianie wartości zmiennych 42 - 3 < 7 co jest nieprawdą i pętla się kończy. W drugim przykładzie masz w pętli porównanie x < j gdzie x nie zmienia swojej wartości po kolejnych obiegach pętli (x = n - k ale dla początkowych wartości n = 7 i k = 3. Nie ma nigdzie ponownego przypisanie dlatego wartość x nie zmienia się i kolejne porównania przyjmują postać 4 < 7, 4 < 6, 4 < 5, 4 < 4 - dlatego pętla wykona więcej obiegów). Może to być mylące np. dla osób programujących wcześniej w Pascalu. Nie jestem tego w 100% pewien, ale tam jeśli sformułujemy pętlę “for i := 1 to k” to nawet jeśli wewnątrz pętli zmienimy wartość k do sprawdzania warunku kontynuacji pętli zostanie użyta pierwotna jej wartość.
Nie spodziewałem się tak rozległej odpowiedzi Po prostu nie wiedziałem, że warunek jest obliczany zawsze na nowo. Teraz wszystko jest jasne i klarowne. Serdecznie dzjękuję za odpowiedź
Może łatwiej Ci będzie to też zrozumieć i zapamiętać, wiedząć, że:
for(int i = 0; i < n; i++) { //kod }
i
{ int i = 0; while(i < n) { //kod i++; } }
Po wykonaniu dadzą ten sam efekt.
Zwykle się tak nie rozpisuje, ale w związku z tym w jakim dziale pytanie zostało zadane nie chciałem pozostawić żadnych wątpliwości