2016-09-08 11 views
1

Mein Code ist dazu gedacht, ein Array rückwärts zu drucken, aber aus irgendeinem Grund funktioniert der Dekrementoperator nicht wie erwartet. Nach meinem Verständnis --var dekrementiert die Variable var bevor etwas getan wird, während var-- die Variable var dekrementiert, nachdem eine Operation wie eine for Schleife abgeschlossen wurde.Seltsames Verhalten mit Dekrementoperator

Hier ist mein Code:

#include <iostream> 

int main() { 
    int arrLen; 
    int arr[4]; 
    scanf("%d\n %d %d %d %d", &arrLen, &arr[0], &arr[1], &arr[2], &arr[3]); 
    for (; arrLen >= 0; --arrLen) 
     printf("%d %d\n", arr[arrLen], arrLen); 

    return 0; 
} 

Und hier meine Ergebnisse sind (der richtige Wert in der Ausgabe ist die dekrementiert Variable, fügte ich hinzu, es zu überprüfen):

0 4 
2 3 
3 2 
4 1 
1 0 

Ohne die dekrementiert Variable, die gedruckt es sein sollte:

0 2 3 4 1

Hier sind meine erwarteten Ergebnisse:

2 3 4 1

+0

Warum "\ n" verwenden, in scanf() Funktion? –

+0

@ M.SChaudhari Nach einem int suchen gefolgt von einem \ n –

+1

Wie hat diese Frage 3 Stimmen bekommen, die ich nicht verstehe .... – ZivS

Antwort

7

Der Grund, warum dies nicht, wie Sie sich verhalten erwarten, weil, wie for Schleifen arbeiten.

for (statement_1; condition; statement_2) { 
    body; 
} 

statement_1 wird nur einmal aufgerufen, bevor die Schleife beginnt.

condition wird zu Beginn jedes Durchlaufs in der Schleife ausgewertet. Wenn es wahr ist, wird body ausgewertet. Wenn nicht, wird die Schleife beendet.

statement_2 wird nachbody der am Ende jeden Durchgangs in der Schleife ausgewertet, kurz vor den condition neu zu bewerten.

Also während --var dekrementiert und den dekrementierten Wert zurückgibt, wird es nur tatsächlich nach dem Körper Ihrer for Schleife jedes Mal aufgerufen, wenn es ausgeführt wird.

Dies bedeutet, dass --varvar-- und wird die gleiche Wirkung auf das Verhalten eines for Schleife, wenn Teil statement_2 haben.

Um Ihre gewünschte Verhalten erzeugen Sie Ihre for-Schleife dies ändern könnte:

while (--arrLen >= 0) 
    printf("%d %d\n", arr[arrLen], arrLen); 
0

Versuchen Sie es mit der folgenden Zeile. Ich denke deine For-Schleife war nicht korrekt.

for (; arrLen > 0; --arrLen) printf("%d %d\n", arr[arrLen - 1], arrLen); 

Es wird nun haben die folgende Ausgabe

2 4 
3 3 
4 2 
1 1 
+0

Das wird funktionieren, aber es behandelt nicht das zugrunde liegende Missverständnis darüber, wie 'for' funktioniert – sokkyoku