2013-06-01 8 views
14

Ich lerne Programmierung und ich habe aus der Sprache C gestartet. Ich habe gelesen Lasst uns C buchen. Und ich ging dieses Programm in diesem Buch durch.Pre-Inkrement vs Post-Inkrement in Array

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) ; 
} 

Mein Verständnis war, wird es i as 2 drucken, j as 1 und m as 15

Aber irgendwie ist es Druck als i as 3, j as 2 und m as 15? Wieso ist es so?

Unten ist mein 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. 

Gibt es etwas falsch in meinem Verständnis?

+0

Ich bin nicht sicher, dass die Programmierung mit C zu lernen Start der beste Weg ist. Haben Sie erwogen, mit Scheme zu beginnen und [SICP] zu lesen (http://mitpress.mit.edu/sicp/) (oder vielleicht mit Ocaml oder vielleicht Python)? –

Antwort

21

Sie treffen den Nagel auf den Kopf. Dein Verständnis ist korrekt. Der Unterschied zwischen Pre- und Post-Inkrement-Ausdrücken ist genau wie es klingt. Vorinkrementierung bedeutet, dass die Variable erhöht wird, bevor der Ausdruck festgelegt oder ausgewertet wird. Post-Inkrementierung bedeutet, dass der Ausdruck festgelegt oder ausgewertet wird und anschließend die Variable geändert wird. Es ist leicht, es als zweistufigen Prozess zu betrachten.

b = x++; 

ist wirklich:

b = x; 
x++; 

und

b = ++x; 

ist wirklich:

x++; 
b = x; 

EDIT: Der schwierige Teil der Beispiele, die Ihnen zur Verfügung gestellt (die Sie wahrscheinlich warf off) ist, dass es einen großen Unterschied gibt zwischen einem Array-Index und seinem Wert.

i = ++a[1]; 

Das heißt, den Wert in a [1] erhöhen und dann auf die Variable i setzen.

m = a[i++]; 

Dies bedeutet, setzen Sie m auf den Wert von a [i], dann inkrementiere ich. Der Unterschied zwischen den beiden ist ein ziemlich großer Unterschied und kann auf den ersten Blick verwirrend sein.

Zweite EDIT: Zusammenbruch des Codes

{ 
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) ; 
} 

Erstens:

i = ++a[1]; 

An dieser Stelle wissen wir, a [1] = 1 (denken Sie daran Arrays sind Null indiziert). Aber wir erhöhen es zuerst. Deshalb i = 2.

j = a[1]++; 

Erinnern wir erhöht a [1] vor, so ist es zur Zeit 2. Wir setzen j = 2, und dann erhöht sie auf 3. So j = 2 und jetzt ein [1] = 3.

m = a[i++]; 

wir wissen, i = 2. Also brauchen wir m = a [2] auf, und erhöhen i dann. Am Ende dieses Ausdrucks ist m = 15 und i = 3.

Zusammengefasst

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

Danke Eric für die Klärung der Zweifel, aber warum dann die Ausgabe des Programms kommt anders? –

+0

Ich habe den Code erneut bearbeitet, mit einer detaillierten Aufschlüsselung dessen, was passiert. Ich denke, es ist ziemlich klar, lassen Sie es mich wissen, wenn Sie weitere Erläuterungen benötigen. : D –

+0

Danke Eric für das detaillierte Verständnis. –

5

Ihr Verständnis ist nicht ganz richtig. Operatoren vor und nach dem Inkrementieren sind unäre Operatoren.

Also zunächst, wenn b = 5, dann inkrementiert ++ b oder b ++ den Wert von b bis 6. Der Unterschied zwischen Pre und Post kommt jedoch, wenn Sie einen Zuweisungsoperator "=" verwenden.

So

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 

Zum klaren Verständnis, können Sie die oben genannten Aussagen unterteilen, wie:

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

Beispiel Also, Sie haben:

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 
} 

Aus Gründen der Klarheit I Ich spalte den obigen Code in mehrere Anweisungen:

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 
} 

Ich hoffe, die obige Erklärung löscht Ihre Zweifel und die Ausgabe des Programms, das Sie ausführen.

1

Erläuterung:

Schritt 1: int a [5] = {5, 1, 15, 20, 25}; Die Variable arr wird als Integer-Array mit einer Größe von 5 deklariert und zu [0] = 5, a [1] = 1, a [2] = 15, a [3] = 20, a [4] initialisiert ] = 25.

Schritt 2: int i, j, m; Die Variablen i, j, m werden als Integer-Typ deklariert.

Schritt 3: i = ++ a [1]; wird i = ++ 1; Daher gilt i = 2 und a [1] = 2

Schritt 4: j = a [1] ++; wird j = 2 ++; Daher gilt j = 2 und a [1] = 3.

Schritt 5: m = a [i ++]; wird m = a [2]; Daher ist m = 15 und i wird um 1 inkrementiert (i ++ bedeutet 2 ++, so i = 3)

Schritt 6: printf ("% d,% d,% d", i, j, m); Es gibt den Wert der Variablen i, j, m

Daraus ergibt sich die Ausgabe des Programms 3, 2, 15