1 / 5
Mar 2018

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.

  • created

    Mar '18
  • last reply

    Mar '18
  • 4

    replies

  • 935

    views

  • 3

    users

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 :slight_smile: Po prostu nie wiedziałem, że warunek jest obliczany zawsze na nowo. Teraz wszystko jest jasne i klarowne. Serdecznie dzjękuję za odpowiedź :slight_smile:

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 :wink: