Inkrementacja w pętlach zagnieżdżonych

0
#include <stdio.h>

int main (void)
{
    int numbers[10] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    int i, j;

    for ( j = 0; j < 10; ++j )
        for ( i = 0; i < j; ++i )
            numbers[j] += numbers[i];

    for ( j = 0; j < 10; ++j )
        printf ("%i ", numbers[j]);

    printf ("\n");

    return 0;
}

Wynik jaki otrzymuje to: 1 1 2 4 8 16 32 64 128 256

Mam pytanie odnośnie tej części programu:

    for ( j = 0; j < 10; ++j )
        for ( i = 0; i < j; ++i )
            numbers[j] += numbers[i];

Na początku mamy j = 0. Jak rozumiem inkrementacja zajdzie po zakończeniu przejścia wszystkiego w pętli, czyli będziemy mieli j = 1 dopiero, gdy zostanie wykonana ta część kodu, czy tak?

 for ( i = 0; i < j; ++i )
            numbers[j] += numbers[i];

jeśli jest to prawda to przecież warunek w pętli zagnieżdżonej nigdy nie zostanie spełniony (i < j), ponieważ na początku i = 0 i j =0, więc i nie jest mniejsze od j, a j = 1 dopiero po przejściu pętli czy tak (tak się sugerowałem odpowiedziami na innych forach). W sumie nigdy j nie będzie większe od i, bo przejście i inkrementacja nastąpi dopiero po tym jak się wykona to co jest w środku, czyli najpierw i się zwiększy, a potem j.

Chyba problem jest w tym, że nie rozumiem dokładnie w którym momencie w pętlach zachodzi inkrementacja. Czy jest duża różnica w pętli jeśli chodzi o pre i postinkrementacje.

W zmiennych jest różnica, jeśli napiszemy np.
a = ++b
lub
a = b++
ale nie wiem jak jest w pętlach

2

Pętlę for można prosto przerobić na pętlę while().

for( INSTRUKCJA_STARTOWA; WARUNEK; INKREMENTACJA ) {
    costam;
    cos_innego();
}

Odpowiednik takiego fora to:

INSTRUKCJA_STARTOWA;
while(WARUNEK) {
    costam;
    cos_innego();
    INKREMENTACJA;
}

W twoim przypadku zatem mielibyśmy coś takiego:

j = 0;
while(j < 10) {
    i = 0;
    while(i < j) {
        numbers[j] += numbers[i];
        ++i;
    }
    ++j;
}

Jak widać, nie ma różnicy, czy użyjesz "++i", "i++" czy "i += 1" - inkrementacja zawsze nastąpi pod koniec przebiegu pętli.

2

Myślę, że potrzebujesz jeszcze raz przeanalizować co się dokładnie dzieje. Spróbuj wykonać tak zmodyfikowany program, żeby zobaczyć jakie wartości osiągają zmienne i oraz j:

#include <stdio.h>

int main (void)
{
    int numbers[10] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    int i, j;

    for ( j = 0; j < 10; ++j ) {
        printf("Zmieniam j na %i\n", j);
        for ( i = 0; i < j; ++i ) {
            printf("Zmieniam i na %i, j=%i\n", i, j);
            numbers[j] += numbers[i];
        }
    }

    for ( j = 0; j < 10; ++j )
        printf ("%i ", numbers[j]);
    printf ("\n");

    return 0;
}

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