2013-06-01 12 views
14

Uczę się programowania i zacząłem od języka C. Czytałem książkę Let the C. I przeglądałem ten program w tej książce.Pre inkrement a Post przyrost w tablicy

main() 
{ 
int a[5] = { 5, 1, 15, 20, 25 } ; 
int i, j, k = 1, m ; 
i = ++a[1] ; 
j = a[1]++ ; 
m = a[i++] ; 
printf ("\n%d %d %d", i, j, m) ; 
} 

Moje zrozumienie było, to wydrukować i as 2, j as 1 i m as 15

Ale jakoś drukuje jak i as 3, j as 2 i m as 15? Dlaczego tak jest?

Poniżej jest moje understanding-

b = x++; 
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used. 

b = ++y; 
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression. 

Czy jest coś złego w moim zrozumieniu?

+0

nie jestem pewien, że zaczynają uczyć się programowania w C jest najlepszym sposobem. Czy rozważałeś rozpoczęcie pracy ze Scheme i czytanie [SICP] (http://mitpress.mit.edu/sicp/) (lub może zaczynając od Ocaml, czy może Python)? –

Odpowiedz

21

Uderzyłeś paznokciem w głowę. Twoje zrozumienie jest poprawne. Różnica między wyrażeniami przyrostowymi przed i po jest taka, jak się wydaje. Pre-inkrementacja oznacza, że ​​zmienna jest inkrementowana przed ustawieniem lub oceną wyrażenia. Post-inkrementacja oznacza, że ​​wyrażenie jest ustawione lub ocenione, a następnie zmienna zostaje zmieniona. Łatwo jest myśleć o tym jako o dwuetapowym procesie.

b = x++; 

jest naprawdę:

b = x; 
x++; 

i

b = ++x; 

jest naprawdę:

x++; 
b = x; 

EDIT: Najtrudniejsze przykłady podałeś (które prawdopodobnie wyrzucił cię off) jest to, że istnieje ogromna różnica między indeksem tablicy a jej wartością.

i = ++a[1]; 

Oznacza to zwiększenie wartości zapisanej w [1], a następnie ustawienie jej na zmienną i.

Ten symbol oznacza zestaw m do wartości [i], a następnie inkrementację. Różnica między nimi jest dość duża i na początku może się wydawać niejasna.

drugie EDIT: podział kodu

{ 
int a[5] = { 5, 1, 15, 20, 25 } ; 
int i, j, k = 1, m ; 
i = ++a[1] ; 
j = a[1]++ ; 
m = a[i++] ; 
printf ("\n%d %d %d", i, j, m) ; 
} 

pierwszy:

i = ++a[1]; 

W tym momencie wiemy [1] = 1 (pamiętaj tablice są indeksowane zera). Ale najpierw zwiększamy to. Dlatego = 2.

j = a[1]++; 

Pamiętaj, zwiększany a [1] przed, więc jest obecnie 2. Stawiamy j = 2, a następnie zwiększa się ją do 3. Więc j = 2, a teraz [1] = 3.

m = a[i++]; 

Znamy i = 2. Musimy ustawić m = a [2], a następnie zwiększyć i. Na końcu tego wyrażenia m = 15, i i = 3.

Podsumowując,

i = 3, j = 2, m = 15. 
+0

Dziękuję Ericowi za wyjaśnienie wątpliwości, ale dlaczego dane wyjściowe programu są różne? –

+0

Ponownie zredagowałem kod ze szczegółowym rozbiciem tego, co się dzieje. Myślę, że to całkiem jasne, daj mi znać, jeśli potrzebujesz więcej wyjaśnień. : D –

+0

Dziękuję Ericowi za szczegółowe zrozumienie. –

5

Zrozumienie nie jest dokładnie poprawne. Operatorzy pre-increment i post-increment to operatory jednoargumentowe.

Tak więc, początkowo, jeśli b = 5, to ++ b lub b ++ zwiększa wartość od b do 6. Różnica między pre i post przychodzi, gdy używasz operatora przypisania "=".

Więc

if b=5 
a=b++ // after this statement a=5 and b=6 as it is post increment 
c=++b // after this statement c=7 and b=7 

Dla zrozumienia, można podzielić powyższe stwierdzenia jak:

a=b; 
b=b+1; //post increment 
b=b+1; //pre increment 
c=b;` 

Więc na przykład dałeś:

main()  
{  
int a[5] = { 5, 1, 15, 20, 25 } ;  
int i, j, k = 1, m ; 
i = ++a[1] ; // a[1] = 2 and i = 2 
j = a[1]++ ; // j = 2 and a[1] = 3 
m = a[i++] ; // m = a[2++] = 15, i now becomes 3 
printf ("\n%d %d %d", i, j, m) ; // so i =3, j= 2 and m =15 
} 

Dla jasności, ja dzielę powyższy kod na wiele instrukcji:

main()  
{  
int a[5] = { 5, 1, 15, 20, 25 } ;  
int i, j, k = 1, m ; 
a[1] = a[1] + 1; 
i = a[1]; 
j = a[1]; 
a[1] = a[1] + 1; 
m = a[i]; // m = a[2] = 15 
i = i + 1; 
printf ("\n%d %d %d", i, j, m) ; // so i =3, j= 2 and m =15 
} 

Mam nadzieję, że powyższe wyjaśnienie usuwa wątpliwości i wyniki programu, z którego korzystasz.

1

Objaśnienie:

Etap 1: Int w [5] = {5, 1, 15, 20, 25}; Zmienna arr jest zadeklarowana jako tablica liczb całkowitych o rozmiarze 5 i jest inicjalizowana do [0] = 5, a [1] = 1, a [2] = 15, a [3] = 20, a [4] ] = 25.

Krok 2: int i, j, m; Zmienna i, j, m są zadeklarowane jako liczba całkowita.

Krok 3: i = ++ a [1]; staje się i = ++ 1; Stąd i = 2 i a [1] = 2

Krok 4: j = a [1] ++; staje się j = 2 ++; Stąd j = 2 i a [1] = 3.

Krok 5: m = a [i ++]; staje się m = a [2]; Zatem m = 15 i i jest zwiększane o 1 (i ++ oznacza 2 ++, więc i = 3)

Etap 6: printf ("% d,% d,% d", i, j, m); Wypisuje wartość zmiennej i, j, m

Stąd wyjście programu jest 3, 2, 15