2017-02-17 2 views
-1

Bei der Ausführung dieses Stücks C-Befehl ist die Ausgabe von num 7. Ich habe erwartet, dass es 6 ist, kann jemand erklären, warum und wie es sich herausstellt, 7 zu sein?C Inkrement Operator Erläuterung

#include <stdio.h> 

int main() { 
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    int i = 0, num = 0; 
    num = a[++i + a[++i]] + a[++i]; 
    printf("%d ", i); 
    printf("%d ", num); 
    return 0; 
} 
+2

Es undefinierten Verhalten ist - Sie können nicht gleiche Variable ändern zweimal zwischen im gleichen Arbeitsgang. – yeputons

+0

Haben Sie nicht dieselbe Frage innerhalb derselben Stunde gestellt? (Zugegeben, Sie haben es diesmal viel besser formuliert. :)) – synchronizer

Antwort

0

Dies ist etwas schwierig, den Ausdruck: a[++i+a[++i]], beinhaltet das Inkrement der variable i zwei Mal, und kommt aus a[i + 2 + a[i + 2]], zu sein, die a[0 + 2 + a[2]] = a[4] = 4, und der zweite Operand ist, a[++i]a[3] wird, was gleich 3 ist Daher ist die endgültige Antwort 7. Mit anderen Worten, dies ist undefiniertes Verhalten.

0

llvm auf OS X gibt mir 6 und eine Warnung:

wi.c:5:8: warning: multiple unsequenced modifications to 'i' [-Wunsequenced] 

das, dass wir bei einem undefinierten Verhalten vermuten lässt. Die genaue Art dessen, was es hier nicht definiert, ist mir bisher nicht klar, fühlt sich aber ein wenig irrelevant an.

+0

[Diese SO-Antwort] (http://Stackoverflow.com/a/19862240/4045754) erklärt und stellt Links zur Verfügung, warum dies ein undefiniertes Verhalten ist und vermieden werden sollte. – yeniv

1

i erhöht wird 3-mal in dem gleichen Ausdruck in num = a[++i + a[++i]] + a[++i];

Dies hat nicht definiertes Verhalten in C. Es ist ein strittiger Punkt versuchen zu erklären, warum es 7 oder 6 oder irgend etwas ausgibt. Undefiniertes Verhalten kann alles sein.

-1
i = 0; 
num = a[ ++i + a[++i]] + a[++i] 

evaluieren zu

num = a[1+ a[2]] + a[3] 
num = a[1 + 2] + a[3] 
num = a[3] + a[3] 
num = 3 + 3 
num = 6 
+1

nein, würde es nicht. –

+0

@Antti Haapala Wie kommt es? – iNullPointer

+1

Siehe die doppelte Frage und ihre Antwort. –

Verwandte Themen